<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="https://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/smartwatches" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Smartwatches ]]></title>
                <link>https://www.tomsguide.com/wellness/smartwatches</link>
        <description><![CDATA[ All the latest smartwatches content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Sun, 02 Aug 2026 10:30:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ I don’t trust the heart rate sensors on watches, so wear a chest strap on every run — here are the 4 best straps I’ve tested ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/i-dont-trust-the-heart-rate-sensors-on-watches-so-wear-a-chest-strap-on-every-run-here-are-the-4-best-straps-ive-tested</link>
                                                                            <description>
                            <![CDATA[ The optical heart rate sensors on watches have improved greatly in recent years, but chest straps still offer an extra level of reliability that I value with my own training. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6fbz7bahrNMJbnW5BmgNeW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TZtTyWFxWzXz7QKVUMV8NY-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 02 Aug 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nick Harris-Fry ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/J5Jjp49GUVjLZEbjEkTex.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick has been a journalist since 2012 and has spent most of that time writing about health and fitness for a variety of publications. Nick spent nine years working on the Coach magazine and website before moving to the fitness team at Tom’s Guide in 2024. Nick is a keen runner and also the founder of YouTube channel &lt;a href=&quot;https://www.youtube.com/channel/UCOBM9FasII4dKbyE_HKkbjw&quot;&gt;The Run Testers&lt;/a&gt;, which specialises in reviewing running shoes, watches, headphones and other gear.&lt;/p&gt;&lt;p&gt;Nick has covered all aspects of health and fitness throughout his career, interviewing experts and celebrities, trying fitness classes and running marathons, all in the name of providing readers with the information they need to get the most out of an active lifestyle.&lt;/p&gt;&lt;p&gt;Nick ran his first marathon in 2016 after six weeks of training for a magazine feature and subsequently became obsessed with the sport. He now has PBs of 2hr 25min for the marathon and 15min 30sec for 5K, and has run 16 marathons in total, as well as a 50-mile ultramarathon.&lt;/p&gt;&lt;p&gt;Nick runs 60-90 miles a week and races regularly with his club, which gives him a lot of opportunity to test out running gear: he has tested and reviewed hundreds of pairs of running shoes, as well as fitness trackers, running watches, sports headphones, treadmills, and all manner of other kit. Nick is also a qualified Run Leader in the UK.&lt;/p&gt;&lt;p&gt;Nick is an established expert in the health and fitness area and along with writing for several publications, including &lt;a href=&quot;https://www.livescience.com/author/nick-harris-fry&quot;&gt;Live Science&lt;/a&gt;, &lt;a href=&quot;https://www.expertreviews.co.uk/authors/nick-harris-fry&quot;&gt;Expert Reviews&lt;/a&gt;, &lt;a href=&quot;https://www.wareable.com/author/n.harris-fry&quot;&gt;Wareable&lt;/a&gt;, &lt;a href=&quot;https://www.coachweb.com/author/nick-harris-fry&quot;&gt;Coach&lt;/a&gt; and &lt;a href=&quot;https://www.getsweatgo.com/author/n.harrisfry&quot;&gt;Get Sweat Go&lt;/a&gt;, he has been quoted on &lt;a href=&quot;https://www.theguardian.com/thefilter/2024/oct/20/if-you-pay-more-than-4-youre-being-ripped-off-the-fair-price-for-14-everyday-items-from-cleaning-spray-to-olive-oil&quot;&gt;The Guardian&lt;/a&gt; and &lt;a href=&quot;https://www.independent.co.uk/life-style/health-and-families/london-marathon-2021-date-training-tips-summer-running-a9482486.html&quot;&gt;The Independent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Nick graduated from the University of York in 2010 with a degree in Politics, Philosophy and Economics and worked in the NHS for three years, during which time he completed his NCTJ Diploma in Journalism at News Associates in London. Before starting on Coach and moving into health and fitness, Nick worked as a football journalist and lived in Kathmandu, Nepal for two years.&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/TZtTyWFxWzXz7QKVUMV8NY-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin Forerunner 970 &amp; Garmin HRM 600]]></media:description>                                                            <media:text><![CDATA[Garmin Forerunner 970 &amp; Garmin HRM 600]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin Forerunner 970 &amp; Garmin HRM 600]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TZtTyWFxWzXz7QKVUMV8NY-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I started testing the <a href="https://www.tomsguide.com/us/best-gps-watches,review-2638.html">best sports watches</a> just over a decade ago, and even back then almost all the new releases had a built-in optical heart rate sensor. </p><p>It was also the time I started to take my own running seriously, which meant following a training plan set by a coach with sessions of varying intensity throughout the week. I often relied on heart rate data to judge my effort during these sessions, along with my own perception of how hard I was working.</p><p>This quickly led to the realisation that the sensors on watches were often out of whack with my own estimation of effort, and once I started using a chest strap heart rate monitor, my concerns about the accuracy of those watches were confirmed.</p><p>In the years since then the sensors on watches have gotten a lot better. The <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">best Garmin watches</a> and the Apple Watch in particular usually produce accurate readings during runs, in my experience.</p><p>However, if you use heart rate to judge your effort during runs, or pay close attention to the training analysis and recovery stats on your watch, which rely heavily on heart rate data, even the best optical sensors can still fall short, and I prefer to use a chest strap during all my runs myself.</p><p>It’s one of the best accessories you can get for your workouts, in my opinion — here’s why.</p><h3 class="article-body__section" id="section-why-chest-straps-are-more-reliable-than-optical-sensors-on-watches"><span>Why chest straps are more reliable than optical sensors on watches</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:5002px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="mEZiQeyqe8qZsxcdsbBkMY" name="Garmin Forerunner 970 & Garmin HRM 600" alt="Garmin Forerunner 970 & Garmin HRM 600" src="https://cdn.mos.cms.futurecdn.net/mEZiQeyqe8qZsxcdsbBkMY.jpg" mos="" align="middle" fullscreen="" width="5002" height="2814" attribution="" endorsement="" 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 key difference with chest straps vs optical heart rate sensor is how they go about measuring heart rate.</p><p>Chest straps measure electrical signals directly from the heart, which not only makes them very accurate, but also means there’s virtually zero lag in their readings when your heart rate changes suddenly, like when you’re doing an interval session and quickly speed up.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1387px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="JzKreirKkyqZHTbUqMomrk" name="Google Pixel Watch 2 HR sensor.jpg" alt="Google Pixel Watch 2 heart rate sensor" src="https://cdn.mos.cms.futurecdn.net/v2/t:138,l:131,cw:1387,ch:780,q:80/JzKreirKkyqZHTbUqMomrk.jpg" mos="" align="middle" fullscreen="" width="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>Optical sensors use LED lights to measure changes in your blood volume, which affects how the light is reflected back to the sensor. This is a less direct method than electrical signals, and prone to interference.</p><p>When you’re at rest optical sensors on watches are usually very reliable, but during workouts when your heart rate can rise and fall rapidly and you might be swinging your arm around a lot, optical sensors have a harder time.</p><p>Chest straps are in a much more stable position as well as using a more reliable method of measuring heart rate. </p><p>In around a decade of using them almost daily, I can only remember a handful of incidents where I felt my chest strap was producing inaccurate results. In contrast, there are several problems that arise regularly with optical sensors on watches.</p><h3 class="article-body__section" id="section-common-problems-with-watch-sensors-during-runs"><span>Common problems with watch sensors during runs</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="jYSJu2Y8oNcLrmQ2eSqRVa" name="Garmin HRM600 and Garmin Forerunner 970" alt="Garmin HRM600 and Garmin Forerunner 970" src="https://cdn.mos.cms.futurecdn.net/jYSJu2Y8oNcLrmQ2eSqRVa.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>As I mentioned above, the heart rate sensors on watches are good these days, but there are still certain issues that crop up from time to time during runs.</p><p>The most common one is lag. Optical sensors take longer to notice rapid changes in heart rate, so during interval sessions they don’t rise and fall as quickly as a chest strap.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1357px;"><p class="vanilla-image-block" style="padding-top:43.77%;"><img id="967HqszYgBKyQrEs89U2WL" name="HR Graph" alt="HR Graph for Garmin Cirqa testing" src="https://cdn.mos.cms.futurecdn.net/967HqszYgBKyQrEs89U2WL.png" mos="" align="middle" fullscreen="" width="1357" height="594" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DC Rainmaker Analyzer)</span></figcaption></figure><p>This can make it trickier to use heart rate to judge effort in short intervals in particular, but as you can see from the graph above the lag might only be a few seconds and overall it’s not a huge problem in my opinion, as long as you bear it in mind when running.</p><p>A bigger problem is cadence lock, which is still a major issue with some watches I test. This is when the optical sensor on the watch gets confused and measures your cadence — how often your feet hit the ground — rather than your heart rate.</p><p>This results in way too high a heart rate for me during runs, and means that an easy jog can be classed as an all-out effort in a watch’s training analysis, skewing my recovery data for weeks.</p><p>Since most people’s cadence when running is somewhere between 160 and 200, it can also be hard to even tell when your watch is reading it instead of your heart rate, because a lot of people will be hitting that kind of heart rate in runs.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:30.83%;"><img id="wjvn85NnQHNRLgDGraCDtH" name="HR Graph" alt="HR Graph" src="https://cdn.mos.cms.futurecdn.net/wjvn85NnQHNRLgDGraCDtH.png" mos="" align="middle" fullscreen="" width="1920" height="592" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DC Rainmaker Analyzer)</span></figcaption></figure><p>You can see in this graph that the watch I was wearing jumped between heart rate and my cadence for the first half of a run before actually locking onto my pulse correctly. Cadence lock at the start of a run is especially common.</p><p>Another common problem I’ve experienced with optical sensors is that they are less reliable in cold conditions, because blood vessels near your skin contract, making it harder to measure heart rate using blood 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:1920px;"><p class="vanilla-image-block" style="padding-top:30.26%;"><img id="q6jmJWGHkHQrBtkumKNZuH" name="HR Graph" alt="HR Graph" src="https://cdn.mos.cms.futurecdn.net/q6jmJWGHkHQrBtkumKNZuH.png" mos="" align="middle" fullscreen="" width="1920" height="581" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DC Rainmaker Analyzer)</span></figcaption></figure><p>I find this makes cadence lock even more likely to happen, as in this graph where I compared a watch to a chest strap during a hard session involving three 5K efforts, where the watch read incorrectly high throughout.</p><h3 class="article-body__section" id="section-downsides-of-chest-straps"><span>Downsides of chest straps</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="As5teVFcNHkyNcadjRBsZM" name="Wahoo TRACKR and strap.jpg" alt="Wahoo TRACKR heart rate monitor" src="https://cdn.mos.cms.futurecdn.net/As5teVFcNHkyNcadjRBsZM.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nick Harris-Fry/Future)</span></figcaption></figure><p>Chest straps might be very accurate, but they’re still not the perfect product. Many people find it uncomfortable to wear them compared with watches, and during the winter months, pulling a cold strap onto your chest certainly makes for an unpleasant second or two, I can tell you.</p><p>They’re not unfailingly accurate too, and to reduce the risk of errors especially at the start of runs it’s worth wetting the sensors on the inside of the band. Ideally you can do this either with water or a dedicated gel, but a quick lick also gets the job done in a pinch.</p><p>You might not want to lick your chest strap though, because another problem with them is that they can get pretty disgusting over long-term use if you’re not careful about washing them regularly.</p><p>If you’re not a fan of chest straps, but do find wrist sensors inaccurate, then armbands can be a good middle ground.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="V5xfzncjX2qzEkiKGGnvUT" name="Coros Heart Rate Monitor" alt="Coros Heart Rate Monitor" src="https://cdn.mos.cms.futurecdn.net/V5xfzncjX2qzEkiKGGnvUT.png" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>These use optical sensors, but the position on your upper arm makes them more stable and reliable. The extra muscle mass in your upper arm tends to create a better contact point for the sensor too.</p><p>I’ve used the Coros Heart Rate Monitor for long periods and found it reliable, but actually I find chest straps comfortable and less hassle than armbands at times. </p><p>This is mainly because I put my heart rate sensor on last before a run, and can just lift my top up to put on a chest strap, whereas with armbands I have to take off a long-sleeved top or jacket entirely to put them on.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XjayQO"></div>                            </div>                            <script src="https://kwizly.com/embed/XjayQO.js" async></script><h3 class="article-body__section" id="section-best-chest-strap-heart-rate-monitors-i-ve-tested"><span>Best chest strap heart rate monitors I’ve tested</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:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6QpnjcaowMNHZXLftQduob" name="Polar H9 and Polar H10 chest straps" alt="Polar H9 and Polar H10 chest straps" src="https://cdn.mos.cms.futurecdn.net/6QpnjcaowMNHZXLftQduob.png" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve yet to test a chest strap that proved really unreliable in terms of heart rate accuracy, so picking out the best I’ve tested comes down to other features, like extra stats, battery life and price.</p><h2 id="coospo-h9z">Coospo H9Z</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nx92dYQGKgCHmbN23AMZWf" name="Coospo H9Z" alt="Coospo H9Z" src="https://cdn.mos.cms.futurecdn.net/nx92dYQGKgCHmbN23AMZWf.png" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Coospo’s line-up of budget heart rate monitors is impressive, and the H9Z is a great option for those who want an accurate chest strap at a low price, especially because it’s almost always in sales.</p><p>It’s a waterproof sensor with a rechargeable battery that lasts for up to 50 hours of use. I prefer this to using coin battery-powered straps myself, having broken a strap or two when changing batteries.</p><p>You can pair watches, apps and bike computers to the Coospo H9Z via both Bluetooth and ANT+, and it has a waterproof IP67 rating, though it’s not suitable for swimming.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:29.53%;"><img id="RH2F62nmma3dY5uzjTmpvH" name="HR Graph" alt="HR Graph" src="https://cdn.mos.cms.futurecdn.net/RH2F62nmma3dY5uzjTmpvH.png" mos="" align="middle" fullscreen="" width="1920" height="567" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DC Rainmaker Analyzer)</span></figcaption></figure><p>I’ve tested the Coospo H9Z extensively and compared it to the ‘gold standard’ straps available like the Polar H10, and its readings were spot on.</p><div class="product"><a data-dimension112="a0f24ebe-8b40-11f1-a1fd-2bda3a8482de" data-action="Deal Block" data-label="The rechargeable Coospo H9Z chest strap is great value even at full price, and it's often reduced to make it even more of a bargain. Right now it's $35 in the Amazon sale, a 40% saving." data-dimension48="The rechargeable Coospo H9Z chest strap is great value even at full price, and it's often reduced to make it even more of a bargain. Right now it's $35 in the Amazon sale, a 40% saving." data-dimension25="$35" href="https://www.amazon.com/COOSPO-Monitor-Bluetooth-Rechargeable-Battery/dp/B0DF2H6J3Q" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1550px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="xEMUokTFnUsqDfNhexjhiT" name="Coospo H9Z Chest Strap sq" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/xEMUokTFnUsqDfNhexjhiT.jpg" mos="" align="middle" fullscreen="" width="1550" height="1550" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The rechargeable Coospo H9Z chest strap is great value even at full price, and it's often reduced to make it even more of a bargain. Right now it's $35 in the Amazon sale, a 40% saving.<a class="view-deal button" href="https://www.amazon.com/COOSPO-Monitor-Bluetooth-Rechargeable-Battery/dp/B0DF2H6J3Q" target="_blank" rel="nofollow" data-dimension112="a0f24ebe-8b40-11f1-a1fd-2bda3a8482de" data-action="Deal Block" data-label="The rechargeable Coospo H9Z chest strap is great value even at full price, and it's often reduced to make it even more of a bargain. Right now it's $35 in the Amazon sale, a 40% saving." data-dimension48="The rechargeable Coospo H9Z chest strap is great value even at full price, and it's often reduced to make it even more of a bargain. Right now it's $35 in the Amazon sale, a 40% saving." data-dimension25="$35">View Deal</a></p></div><h2 id="polar-h10">Polar H10</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bWf8Njx7U7EMoXWkLtwvyj" name="Polar H10" alt="Polar H10" src="https://cdn.mos.cms.futurecdn.net/bWf8Njx7U7EMoXWkLtwvyj.png" mos="" align="middle" fullscreen="" width="1200" height="675" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Polar H10 initially launched in 2017, so the fact it’s still seen as one of the most accurate options available is testament to its quality, and because it’s an older device, it pops up in sales more than ever these days.</p><p>I’ve used the Polar H10 regularly for years, and for a long time it was my main heart rate strap, and I never found it to be inaccurate or unreliable in linking to watches and other devices.</p><p>It uses a coin battery that I found usually had to be changed after about six months of use, and has internal storage for your workouts and can be used for swimming.</p><p>Polar also has the H9 sensor, which is a little cheaper and just as accurate, but can’t be used for swimming as it lacks internal storage. The H9 can also only have one Bluetooth connection at a time, but if you don’t need more than that, it’s worth looking at too.</p><div class="product"><a data-dimension112="f2243234-8b40-11f1-b880-f968f63f5e04" data-action="Deal Block" data-label="Although its an older device, the Polar H10 remains a top pick for many athletes who use chest straps thanks to its unfailing accuracy. If you don't need a strap right now, it might be worth waiting for a sale period like Black Friday, because the H10 is usually reduced well below $100 then." data-dimension48="Although its an older device, the Polar H10 remains a top pick for many athletes who use chest straps thanks to its unfailing accuracy. If you don't need a strap right now, it might be worth waiting for a sale period like Black Friday, because the H10 is usually reduced well below $100 then." data-dimension25="$104" href="https://www.amazon.com/Polar-Heart-Rate-Monitor-Women/dp/B07PM565W2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:688px;"><p class="vanilla-image-block" style="padding-top:98.55%;"><img id="tuETUENSgYx8TE8M4bv7HK" name="Polar H10 chest strap HRM.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tuETUENSgYx8TE8M4bv7HK.jpg" mos="" align="middle" fullscreen="" width="688" height="678" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Although its an older device, the Polar H10 remains a top pick for many athletes who use chest straps thanks to its unfailing accuracy. If you don't need a strap right now, it might be worth waiting for a sale period like Black Friday, because the H10 is usually reduced well below $100 then.<a class="view-deal button" href="https://www.amazon.com/Polar-Heart-Rate-Monitor-Women/dp/B07PM565W2" target="_blank" rel="nofollow" data-dimension112="f2243234-8b40-11f1-b880-f968f63f5e04" data-action="Deal Block" data-label="Although its an older device, the Polar H10 remains a top pick for many athletes who use chest straps thanks to its unfailing accuracy. If you don't need a strap right now, it might be worth waiting for a sale period like Black Friday, because the H10 is usually reduced well below $100 then." data-dimension48="Although its an older device, the Polar H10 remains a top pick for many athletes who use chest straps thanks to its unfailing accuracy. If you don't need a strap right now, it might be worth waiting for a sale period like Black Friday, because the H10 is usually reduced well below $100 then." data-dimension25="$104">View Deal</a></p></div><h2 id="garmin-hrm-600">Garmin HRM 600</h2><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="LkHjUMGEMirucPqpc5Ksca" name="Garmin HRM 600" alt="Garmin HRM 600" src="https://cdn.mos.cms.futurecdn.net/LkHjUMGEMirucPqpc5Ksca.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>The Garmin HRM 600 launched alongside the Garmin Forerunner 970 watch in 2025 and has been my go-to chest strap ever since.</p><p>This is not just because it’s reliably accurate and rechargeable, but also because when linked to a <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">top Garmin watch</a> it adds extra running dynamics stats like step speed loss (how much you slow down with each step during runs) and running economy measurements.</p><p>As with the Polar H10, the Garmin HRM 600 will connect to watches and apps from other brands easily, and you can use it for swimming because it’s waterproof and has internal storage.</p><p>It’s a pricy option, but is now often in sales and if you are a runner with a high-end Garmin watch, the HRM 600 does bring some extra data to the table you can’t get anywhere else.</p><div class="product"><a data-dimension112="4d60f1c4-8b45-11f1-82c9-e3f32d86e16c" data-action="Deal Block" data-label="The Garmin HRM 600 offers extra running technique stats on top of its impeccable accuracy, and its my current go-to chest strap. It's expensive, but starting to appear in sales more regularly this year after launching in mid-2025." data-dimension48="The Garmin HRM 600 offers extra running technique stats on top of its impeccable accuracy, and its my current go-to chest strap. It's expensive, but starting to appear in sales more regularly this year after launching in mid-2025." data-dimension25="$159" href="https://www.garmin.com/en-GB/p/1473393/" 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:103.68%;"><img id="dgg3WsggEx389Wk5KdRHBH" name="Garmin HRM 600" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dgg3WsggEx389Wk5KdRHBH.png" mos="" align="middle" fullscreen="" width="679" height="704" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Garmin HRM 600 offers extra running technique stats on top of its impeccable accuracy, and its my current go-to chest strap. It's expensive, but starting to appear in sales more regularly this year after launching in mid-2025.<a class="view-deal button" href="https://www.garmin.com/en-GB/p/1473393/" target="_blank" rel="nofollow" data-dimension112="4d60f1c4-8b45-11f1-82c9-e3f32d86e16c" data-action="Deal Block" data-label="The Garmin HRM 600 offers extra running technique stats on top of its impeccable accuracy, and its my current go-to chest strap. It's expensive, but starting to appear in sales more regularly this year after launching in mid-2025." data-dimension48="The Garmin HRM 600 offers extra running technique stats on top of its impeccable accuracy, and its my current go-to chest strap. It's expensive, but starting to appear in sales more regularly this year after launching in mid-2025." data-dimension25="$159">View Deal</a></p></div><h2 id="fourth-frontier-zone">Fourth Frontier Zone</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1804px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="oY7V7o3h8jmDwCzFGnkLGF" name="Fourth Frontier Zone HRM" alt="Fourth Frontier Zone" src="https://cdn.mos.cms.futurecdn.net/oY7V7o3h8jmDwCzFGnkLGF.jpg" mos="" align="middle" fullscreen="" width="1804" height="1015" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This is the most expensive chest strap I’ve tested and it’s no more accurate than the others on this list, but it does have an extra feature that some will find vital — it produces live and continuous ECG measurements during activities.</p><p>If you’re an athlete with heart concerns, this extra data could be invaluable along with the heart strain score offered by the device, and it also has vibration alerts you can set up to notify you if you’re pushing too hard in a workout.</p><p>You can also wear it outside workouts to get heart rate, ECG and heart rate variability measurements throughout the day and night — the 30-day battery life on the Fourth Frontier Zone is extremely impressive.</p><p>Unless you need the ECG stats however, I’d look at other straps myself because the Zone is expensive and requires a monthly subscription to unlock all of its features.</p><div class="product"><a data-dimension112="4d60f570-8b45-11f1-bcdb-fd54e9b1a23c" data-action="Deal Block" data-label="Fourth Frontier X2 is available" data-dimension48="Fourth Frontier X2 is available" data-dimension25="£174" href="https://uk.fourthfrontier.com/products/frontier-zone?" 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="j2owqdKrM5BNsTizggR5U" name="Fourth Frontier Zone HRM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/j2owqdKrM5BNsTizggR5U.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Fourth Frontier is a brand that specializes in making heart rate monitors that also provide ECG measurements. The Zone is the cheaper model in its line-up and isn't yet available in the US, but the <a href="https://www.amazon.com/Frontier-X2-Breathing-Continuous-Monitoring/dp/B0CRB6CC2X" target="_blank" rel="nofollow" data-dimension112="4d60f570-8b45-11f1-bcdb-fd54e9b1a23c" data-action="Deal Block" data-label="Fourth Frontier X2 is available" data-dimension48="Fourth Frontier X2 is available" data-dimension25="£174">Fourth Frontier X2 is available</a>.<a class="view-deal button" href="https://uk.fourthfrontier.com/products/frontier-zone?" target="_blank" rel="nofollow" data-dimension112="4d60f570-8b45-11f1-bcdb-fd54e9b1a23c" data-action="Deal Block" data-label="Fourth Frontier X2 is available" data-dimension48="Fourth Frontier X2 is available" data-dimension25="£174">View Deal</a></p></div><p>Do you have a favorite chest strap? Let me know in the comments.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve been testing an uber-affordable fitness tracker, and it has all the features you need to improve your health on a budget ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/xiaomi-smart-band-10-review</link>
                                                                            <description>
                            <![CDATA[ The Xiaomi Smart Band is an affordable way to track your fitness and health and is comfortable to wear 24/7. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yFSyPxLKoS52RG6ELNJXCB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sppVH3W74zvzBJtaGywaRZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 31 Jul 2026 15:19:03 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ ashley.thieme@futurenet.com (Ashley Thieme) ]]></author>                    <dc:creator><![CDATA[ Ashley Thieme ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3AWovHjApwuNrSGRS6WBcL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Ashley Thieme is a staff writer on the Reviews team at Tom’s Guide where she tests out the latest tech so you can know what’s going to be worth your time and money. She has a master’s degree in Magazine Journalism and a bachelor’s degree in Journalism, Media and Sociology from Cardiff University. She has bylines in titles including Women’s Health UK, sharing the latest health and wellness news stories, and Virgin Radio UK, providing the latest entertainment news and working on celebrity interviews. She has experience reporting on a variety of topics including music, literature, motorsport, entertainment and health. In previously published work, she has reviewed live music events, books, and wellness products. She values the importance of tech enhancing your life rather than taking over, and as a music fanatic, she is always looking for the best way to listen to new music releases. Discovering the top audio equipment that enhances sound quality and provides optimum comfort is what Ashley does best. In her spare time, Ashley enjoys hitting her reading goals on Goodreads by getting into the latest novels with a cup of tea as well as getting out in the Welsh mountains for a good hike on the weekend.&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/sppVH3W74zvzBJtaGywaRZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Xiaomi Smart Band 10 in Ceramic Pearl White]]></media:description>                                                            <media:text><![CDATA[Xiaomi Smart Band 10 in Ceramic Pearl White]]></media:text>
                                <media:title type="plain"><![CDATA[Xiaomi Smart Band 10 in Ceramic Pearl White]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sppVH3W74zvzBJtaGywaRZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Need to invest in your first fitness tracker but don’t know where to start? Well, picking up one of the <a href="https://www.tomsguide.com/us/best-cheap-smartwatches,review-6342.html">best cheap smartwatches</a> is the best way to understand what you're looking for. You can start to understand your metrics without breaking the bank, and by knowing what data you find most actionable, you can invest in a more advanced model down the line. I think the Xiaomi Smart Band 10 is an ideal entry-level tracker, and it costs just $62. </p><p>It’s comfortable to wear all day and all night, water-resistant, and gives very accurate tracking data. The useful companion app is the cherry on top, so you can take in all of your metrics at a glance and use it to make lifestyle changes. </p><p>However, some of the data, such as sleep, doesn’t always seem actionable when compared to the feedback and advice I get from the Oura app. The battery life of the Smart Band 10 was also underwhelming, as I couldn’t achieve the advertised 21 days. To find out more about my experience with the wearable, you can keep reading this full Xiaomi Smart Band 10 review.</p><h2 class="article-body__section" id="section-xiaomi-smart-band-10-review-specs"><span>Xiaomi Smart Band 10 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Band 10</strong></p></td><td  ><p><strong>Band 10 Ceramic Edition</strong></p></td><td  ><p><strong>Band 10 Glimmer Edition</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.com/Xiaomi-Smart-Band-Global-Version/dp/B0DYF82545" target="_blank" rel="nofollow">$51</a> / <a href="https://www.amazon.co.uk/Fitness-Monitoring-Electronic-Waterproof-Warranty/dp/B0DYF82545" target="_blank" rel="nofollow">£42</a></p></td><td  ><p><a href="https://www.amazon.com/Xiaomi-Smart-Band-Touchscreen-Multi-Sport/dp/B0F2JHZCQQ">$62</a> / <a href="https://www.amazon.co.uk/XIAOMI-Fitness-Monitoring-Waterproof-Warranty/dp/B0F2JHZCQQ">£54</a></p></td><td  ><p><a href="https://www.mi.com/uk/product/xiaomi-smart-band-10">£69</a></p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>1.8 x 0.9 x 0.4 inches</p></td><td  ><p>1.9 x 0.9 x 0.4 inches</p></td><td  ><p>1.8 x 0.9 x 0.4 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>1.72-inch AMOLED Touch Display</p></td><td  ><p>1.72-inch AMOLED Touch Display</p></td><td  ><p>1.72-inch AMOLED Touch Display</p></td></tr><tr><td class="firstcol " ><p><strong>Display resolution</strong></p></td><td  ><p>212 x 520 pixels</p></td><td  ><p>212 x 520 pixels</p></td><td  ><p>212 x 520 pixels</p></td></tr><tr><td class="firstcol " ><p><strong>Durability</strong></p></td><td  ><p>5ATM</p></td><td  ><p>5ATM</p></td><td  ><p>5ATM</p></td></tr><tr><td class="firstcol " ><p><strong>Weight (without strap)</strong></p></td><td  ><p>0.6 oz</p></td><td  ><p>0.8 oz</p></td><td  ><p>0.6 oz</p></td></tr><tr><td class="firstcol " ><p><strong>Band size</strong></p></td><td  ><p>5.3 - 8.3 inches</p></td><td  ><p>5.3 - 8.3 inches</p></td><td  ><p>5.3 - 7.1 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Screen brightness </strong></p></td><td  ><p>1500 nits</p></td><td  ><p>1500 nits</p></td><td  ><p>1500 nits</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Midnight Black, Glacier Silver, Mystic Rose</p></td><td  ><p>Pearl White</p></td><td  ><p>Glimmer Gold</p></td></tr><tr><td class="firstcol " ><p><strong>Sensors</strong></p></td><td  ><p>Accelerometer, Gyroscope, Electronic compass, Optical heart rate and pulse oximeter, Ambient light sensor</p></td><td  ><p>Accelerometer, Gyroscope, Electronic compass, Optical heart rate and pulse oximeter, Ambient light sensor</p></td><td  ><p>Accelerometer, Gyroscope, Electronic compass, Optical heart rate and pulse oximeter, Ambient light sensor</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth 5.4</p></td><td  ><p>Bluetooth 5.4</p></td><td  ><p>Bluetooth 5.4</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>233mAh</p></td><td  ><p>233mAh</p></td><td  ><p>233mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charge time</strong></p></td><td  ><p>1 hour</p></td><td  ><p>1 hour</p></td><td  ><p>1 hour</p></td></tr><tr><td class="firstcol " ><p><strong>Operating system</strong></p></td><td  ><p>Android 8.0, iOS 14.0 and above</p></td><td  ><p>Android 8.0, iOS 14.0 and above</p></td><td  ><p>Android 8.0, iOS 14.0 and above</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-xiaomi-smart-band-10-review-price-availability"><span>Xiaomi Smart Band 10 review: Price & availability</span></h2><p>The Xiaomi Smart Band 10 is available in three different editions. These editions are priced differently and have slightly different designs and materials, but their operation is the same. The standard edition, the Band 10, is available for purchase for <a href="https://www.amazon.com/Xiaomi-Smart-Band-Global-Version/dp/B0DYF82545" target="_blank" rel="nofollow">$51 on Amazon U.S.</a> and <a href="https://www.amazon.co.uk/Fitness-Monitoring-Electronic-Waterproof-Warranty/dp/B0DYF82545" target="_blank" rel="nofollow">£42 on Amazon U.K.</a> You can pick up this version of the band in three colors, including Midnight Black, Glacier Silver and Mystic Rose.</p><p>The version of the watch I tested is the Smart Band 10 Ceramic Edition in Pearl White, which you can purchase on <a href="https://www.amazon.com/Xiaomi-Smart-Band-Touchscreen-Multi-Sport/dp/B0F2JHZCQQ" target="_blank" rel="nofollow">Amazon U.S. for $62</a> or on <a href="https://www.amazon.co.uk/XIAOMI-Fitness-Monitoring-Waterproof-Warranty/dp/B0F2JHZCQQ" target="_blank" rel="nofollow">Amazon U.K. for £54</a>. You can also purchase a Glimmer Edition of the watch for <a href="https://www.mi.com/uk/product/xiaomi-smart-band-10" target="_blank" rel="nofollow">£69 from the Xiaomi online store</a>, which is available in Glimmer Gold. </p><p>This is obviously very cheap for an in-depth fitness tracker compared to well-known models such as the <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-venu-4-review">Garmin Venu 4</a>, which starts at $549, or the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3</a>, which costs $799. </p><p>But there are also many cheaper smartwatches and fitness trackers that the Xiaomi Smart Band 10 needs to hold its own against. For example, the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> only costs $99 if you want a screen-free tracker. Or the <a href="https://www.tomsguide.com/wellness/fitness-trackers/amazfit-active-3-premium-review">Amazfit Active 3 Premium</a> will only set you back $169 and offers a more Garmin-esque style. We love both of these trackers, so if you’re looking for something more advanced, it could be worth the extra spend.</p><h2 class="article-body__section" id="section-xiaomi-smart-band-10-review-design"><span>Xiaomi Smart Band 10 review: Design</span></h2><p>After wearing the Xiaomi Smart Band 10 every day, it has seamlessly blended with my accessories and complements most outfits — not just my activewear. I have the Band 10 Ceramic Edition, which is a little heavier than the other models you can purchase at 0.8 ounces, but has the same 1.72-inch AMOLED Touch display. I have small wrists, and the pebble-shaped screen fits perfectly, so this is a great option for anyone with narrower features. It felt secure on my wrist when running.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4eJtVTLe4afCVHincZ32PZ" name="Xiaomi Smart Band 10" alt="Xiaomi Smart Band 10 in Ceramic Pearl White" src="https://cdn.mos.cms.futurecdn.net/4eJtVTLe4afCVHincZ32PZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Ceramic Edition, which I tested, has a ceramic frame and a fluororubber strap. This was comfortable to wear for the most part, although after I worked out, the strap rubbed slightly. The standard edition of the Band 10 has an aluminum alloy frame and a TPU strap, and the Glimmer Edition has an aluminum alloy frame and a stainless steel and glass crystal strap. The Glimmer Edition certainly looks the most sophisticated option for everyday wear, but practically, the TPU strap of the standard edition will provide the most comfort for workouts. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sppVH3W74zvzBJtaGywaRZ" name="Xiaomi Smart Band 10" alt="Xiaomi Smart Band 10 in Ceramic Pearl White" src="https://cdn.mos.cms.futurecdn.net/sppVH3W74zvzBJtaGywaRZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>With a 5ATM durability rating, the Xiaomi Smart Band 10 is water-resistant and can be submerged up to 50 meters. That means you can wear the watch to track activities like swimming, and don’t need to worry about your sweat causing any issues. However, the water resistance is not permanent and may reduce over time, according to Xiaomi — this is the case with almost all tech, as water resistance breaks down eventually, so it isn’t an issue.</p><h2 class="article-body__section" id="section-xiaomi-smart-band-10-review-fitness-features"><span>Xiaomi Smart Band 10 review: Fitness features</span></h2><p>After using the Xiaomi Smart Band 10 to track all of my workouts, I’m impressed by how accurate it is. The watch can track 159 different sports and activities, including card games and board games, which I found very interesting. </p><p>It uses a combination of heart rate sensors and a nine-axis motion sensor to track performance. Daily, I wear the Oura Ring 5 to track my movement, and when comparing the data, I can confidently say that the Smart Band 10’s step counting is accurate.  </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="2kqWVEacmMJTotQ9NQ7D2R" name="Xiaomi Smart Band 10" alt="Screenshots from the Mi Fitness app" src="https://cdn.mos.cms.futurecdn.net/2kqWVEacmMJTotQ9NQ7D2R.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Mi Fitness)</span></figcaption></figure><p>When wearing the Smart Band 10 for running. I appreciated notifications for my splits with a small vibration to keep me on track. The metrics such as heart rate, pace, and distance are clearly displayed on the screen, and even though it’s small, I could still read everything while moving. I was able to pause or stop the workout from my wrist without reaching for my phone, and even paused and skipped my music. </p><p>More detailed feedback about your workout can be found in the Mi Fitness companion app, which has your training history and training load. Having these statistics on hand is very useful for managing your training and planning out your future workouts. I used it to plan out my workout days or rest days.</p><h2 class="article-body__section" id="section-xiaomi-smart-band-10-review-health-sleep-features"><span>Xiaomi Smart Band 10 review: Health & sleep features</span></h2><p>As a girl who is almost unhealthily focused on her readiness and sleep scores, I was impressed by the number of metrics I could track with the Xiaomi Smart Band 10. </p><h3 id="health">Health</h3><p>First things first. When you get the Smart Band 10, tracking has to be manually enabled for some metrics. Automatically, you get tracking for your heart rate and steps — you know, the basic stuff. But if you want the metrics that give you meaningful insights, you need to head into settings on the Mi Fitness app and enable them. </p><p>These tracking metrics include blood oxygen tracking, continuous heart rate tracking, stress monitoring and relax reminders. Again, when comparing my readings to my trusty Oura Ring, there wasn’t much discrepancy. I felt as though I could rely on the Smart Band 10 to give me accurate data post-workout.</p><h2 id="sleep">Sleep</h2><p>I was most interested in the sleep tracking on the Smart Band 10. One of the first things I noticed after downloading the app was that after seven nights of sleep, I would be given an animal to suit my sleep personality.</p><p>Apparently I am a shark. This means I fall asleep late, sleep very little, and may even sleep while swimming. Not my most glowing analysis. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="aWReBHz4Lyrkroo9erXd3R" name="Xiaomi Smart Band 10" alt="Screenshots from the Mi Fitness app" src="https://cdn.mos.cms.futurecdn.net/aWReBHz4Lyrkroo9erXd3R.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Mi Fitness)</span></figcaption></figure><p>I like that the app dissects your sleep for analysis, breaking up your deep, light and REM sleep so you can deduce how much rest you actually got. However, I didn’t feel as though I was getting actionable feedback as I do with my Oura Ring or the Amazfit Zepp app. Both of these apps can provide analysis and advice to better your overall health, and I didn’t feel I got that same level of tailored attention from the Mi Fitness app.</p><h2 class="article-body__section" id="section-xiaomi-smart-band-10-review-app"><span>Xiaomi Smart Band 10 review: App</span></h2><p>The Xiaomi Smart Band 10 is compatible with the Mi Fitness app, which is available to download on Android and iOS devices. The app is very straightforward to use and lays out all of your tracked metrics on the home page. </p><p>There are sections in the app for workouts, customizing the watch with digital faces, and your health at a glance. You can delve into all of these sections to get more of an understanding of what they mean and how they are tracked too. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wT8FZzPJzRVRZUEmcduyWY" name="Xiaomi Smart Band 10" alt="Xiaomi Smart Band 10 in Ceramic Pearl White" src="https://cdn.mos.cms.futurecdn.net/wT8FZzPJzRVRZUEmcduyWY.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of my favorite features in the app is the ability to set thresholds for your blood oxygen levels and heart rate spikes and dips when at rest. This is very useful for me as I have an irregular heartbeat, so I like to keep an eye on my heart rate changes throughout the day. </p><h2 class="article-body__section" id="section-xiaomi-smart-band-10-review-battery-life"><span>Xiaomi Smart Band 10 review: Battery life</span></h2><p>The watch houses a Li-Po 233mAh battery that is charged magnetically with the included cable. Xiaomi says the Smart Band 10 has a battery life of up to 21 days under typical usage, but I was unable to obtain that. In fact, in that time I had to charge the watch twice. When the watch says there are six days of battery remaining, I got just over two. I didn’t mind this, though, as it only takes an hour to fully charge. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JTxAZeytBSsxg4tvtGzbRZ" name="Xiaomi Smart Band 10" alt="Xiaomi Smart Band 10 in Ceramic Pearl White" src="https://cdn.mos.cms.futurecdn.net/JTxAZeytBSsxg4tvtGzbRZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Even though I wasn’t able to get the full 21 days of battery life and it was more like seven days, this is far better than the measly 24-hour battery life of the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch Series 11</a>. </p><p>It’s worth noting that if you turn on continuous tracking for blood oxygen and heart rate levels, the battery will drain significantly faster, but I think the trade-off is worth it for in-depth metrics.</p><h2 class="article-body__section" id="section-xiaomi-smart-band-10-review-verdict"><span>Xiaomi Smart Band 10 review: Verdict</span></h2><p>The Xiaomi Smart Band 10 is an affordable option if you want a wearable that’s going to accurately track your workouts. The comfortable design makes it ideal for wearing 24/7, so I was able to track my sleep as well as the whole day’s activities. It’s water-resistant too, so it can be used to track swimming or left on when you hit the showers so you don’t misplace it. </p><p>The useful companion app is the best thing about this watch, as having all of the metrics displayed in an easily digestible format makes it so much easier to understand your body. </p><p>Unfortunately, the battery life isn’t as long as I had hoped. Even when the watch says there are six days of battery remaining, I only got about two. The data also doesn’t feel as actionable as the feedback I get from my Oura Ring, but this is merely a software qualm. The watch itself is great and a decent choice for anyone wanting to start their health tracking journey. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ My doctors couldn't figure out what was wrong with me — then my Oura Ring uncovered a surprising heart condition ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-dragged-myself-to-the-doctors-office-because-of-my-oura-ring-and-experts-say-it-can-help-people-recognise-meaningful-changes-sooner</link>
                                                                            <description>
                            <![CDATA[ After wearing an Oura Ring every day for three years, it’s become the most valued gadget in my life thanks to data that can really make a difference. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bYrGYshdCXyEcgrbtsSTGH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/E7nhPKviXpFxywSkX6UbqD-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Jul 2026 11:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Jul 2026 22:33:28 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ ashley.thieme@futurenet.com (Ashley Thieme) ]]></author>                    <dc:creator><![CDATA[ Ashley Thieme ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3AWovHjApwuNrSGRS6WBcL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Ashley Thieme is a staff writer on the Reviews team at Tom’s Guide where she tests out the latest tech so you can know what’s going to be worth your time and money. She has a master’s degree in Magazine Journalism and a bachelor’s degree in Journalism, Media and Sociology from Cardiff University. She has bylines in titles including Women’s Health UK, sharing the latest health and wellness news stories, and Virgin Radio UK, providing the latest entertainment news and working on celebrity interviews. She has experience reporting on a variety of topics including music, literature, motorsport, entertainment and health. In previously published work, she has reviewed live music events, books, and wellness products. She values the importance of tech enhancing your life rather than taking over, and as a music fanatic, she is always looking for the best way to listen to new music releases. Discovering the top audio equipment that enhances sound quality and provides optimum comfort is what Ashley does best. In her spare time, Ashley enjoys hitting her reading goals on Goodreads by getting into the latest novels with a cup of tea as well as getting out in the Welsh mountains for a good hike on the weekend.&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/E7nhPKviXpFxywSkX6UbqD-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[photos of the Oura Ring 5]]></media:description>                                                            <media:text><![CDATA[photos of the Oura Ring 5]]></media:text>
                                <media:title type="plain"><![CDATA[photos of the Oura Ring 5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/E7nhPKviXpFxywSkX6UbqD-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s nothing more frustrating than feeling a little bit “off.” You can’t put your finger on it, but something in your body is crying out for help. You head to the doctor’s office; they run tests, but everything looks perfectly normal, so you just go home and get some rest. </p><p>Perfect. </p><p>After having major surgery, I spent months feeling just like this. Those months quickly turned into a year, and before I knew it, I was canceling plans with friends and avoiding my usual workout routine.</p><p>Little did I know the thing that would drag me out of this hole was one of the <a href="https://www.tomsguide.com/wellness/fitness-trackers/best-smart-rings">best smart rings</a> that I’ve been wearing on my hand for three years — my <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring</a>.</p><h2 id="i-ve-been-tracking-everything">I’ve been tracking everything</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2599px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yii3yJCsdqgakLrjq5eeKE" name="Oura Ring 5" alt="photos of the Oura Ring 5" src="https://cdn.mos.cms.futurecdn.net/yii3yJCsdqgakLrjq5eeKE.jpg" mos="" align="middle" fullscreen="" width="2599" height="1462" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve been wearing an <a href="https://www.tomsguide.com/reviews/oura-ring-generation-3">Oura Ring 3</a> since 2023, and have recently upgraded to the new <a href="https://www.tomsguide.com/wellness/smart-rings/ive-worn-the-oura-ring-5-for-six-weeks-here-are-3-things-i-love-and-2-things-i-wish-i-could-change">Oura Ring 5</a>. Every morning I open the app to check my sleep score, note to myself what made it a great (or not great) night's sleep, and get on with my day. </p><p>By checking my readiness scores daily, I get a good idea of what my body can handle. If I didn’t get a restful sleep, I take on a lighter load, but if I’ve been out cold for a full nine hours, you can bet I’m going to be climbing a mountain.</p><div><blockquote><p>My heart rate was jumping all over the place even when I was sitting down doing nothing. That, combined with some noticeable palpitations, made me take one more trip to the doctor’s office — and I’m glad I did.</p></blockquote></div><p>I’m a pretty active person. Between running, Pilates, hiking, and running a million and one errands every day, I always hit my step goals. But at the end of 2024, suddenly my readiness scores were, well, poor. </p><p>It didn’t matter how much I slept or how easy I took it the day before; something in my body wasn’t adding up. My <a href="https://www.tomsguide.com/how-to/how-to-use-the-hrv-status-feature-on-your-garmin-watch">HRV (heart rate variability)</a> crashed and my resting heart rate while asleep was higher than ever. So what was happening?</p><p>I dragged myself to the doctor’s office only to be told there wasn’t anything wrong and that I should just take it easy for a while. With a new list of vitamin recommendations, I went home and continued tracking every metric I could, knowing deep down that there was a reason for my sudden fatigue. </p><p>And then I noticed the pattern. My heart rate was jumping all over the place even when I was sitting down doing nothing. That, combined with some noticeable palpitations, made me take one more trip to the doctor’s office — and I’m glad I did.</p><div class="product"><a data-dimension112="9789e6da-8a90-11f1-a6e9-3ddd99e1711d" data-action="Deal Block" data-label="The new Oura Ring 5 is the smallest smart ring in the world. It doesn't look like a fitness tracker, but rather a suave accessory. It features sensor upgrades from the previous Oura Ring 4, making it more accurate than previous models, and has a battery that lasts up to a week per charge." data-dimension48="The new Oura Ring 5 is the smallest smart ring in the world. It doesn't look like a fitness tracker, but rather a suave accessory. It features sensor upgrades from the previous Oura Ring 4, making it more accurate than previous models, and has a battery that lasts up to a week per charge." data-dimension25="$499" href="https://www.amazon.com/Oura-Ring-Smallest-Activity-Compatible/dp/B0GRKGWF3Y" 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="oMuwPhF7LJdV5RKZLjFuba" name="oura-ring-5--deep-rose--size-9--worlds-s-93ef2ba9-2eba-44cb-ba01-a76ca8c719e9.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oMuwPhF7LJdV5RKZLjFuba.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new Oura Ring 5 is the smallest smart ring in the world. It doesn't look like a fitness tracker, but rather a suave accessory. It features sensor upgrades from the previous Oura Ring 4, making it more accurate than previous models, and has a battery that lasts up to a week per charge.<a class="view-deal button" href="https://www.amazon.com/Oura-Ring-Smallest-Activity-Compatible/dp/B0GRKGWF3Y" target="_blank" rel="nofollow" data-dimension112="9789e6da-8a90-11f1-a6e9-3ddd99e1711d" data-action="Deal Block" data-label="The new Oura Ring 5 is the smallest smart ring in the world. It doesn't look like a fitness tracker, but rather a suave accessory. It features sensor upgrades from the previous Oura Ring 4, making it more accurate than previous models, and has a battery that lasts up to a week per charge." data-dimension48="The new Oura Ring 5 is the smallest smart ring in the world. It doesn't look like a fitness tracker, but rather a suave accessory. It features sensor upgrades from the previous Oura Ring 4, making it more accurate than previous models, and has a battery that lasts up to a week per charge." data-dimension25="$499">View Deal</a></p></div><h2 id="what-the-experts-think">What the experts think </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4093px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="ihgdjPzxZot7qNq4Dgxtdm" name="Oura Ring" alt="Oura Ring 3" src="https://cdn.mos.cms.futurecdn.net/ihgdjPzxZot7qNq4Dgxtdm.jpg" mos="" align="middle" fullscreen="" width="4093" height="2302" attribution="" endorsement="" class="inline"></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 set out to find out why wearables can have such a positive impact when uncovering health concerns. And it turns out that my meticulous tracking was actually the right thing to do, and medical professionals advise doing just this. </p><p><a href="https://www.bayhealth.org/find-a-doctor/manu-sehgal" target="_blank">Dr. Manu Segal, medical director at The Moorings at Lewes</a>, told me, “While smart rings like the Oura Ring are not diagnostic devices, they can be remarkably useful for identifying trends that deserve medical attention.”</p><p>He says, “The key is to look for persistent patterns, not isolated readings. A single poor night's sleep or one low HRV value is rarely meaningful. Several weeks of consistent change, however, can provide valuable insight and prompt an earlier conversation with a healthcare professional.”</p><p>Oura is known for its sleep-tracking capabilities, and Dr. Segal notes the sleep score as one of the most telling metrics for long-term health, influencing cardiovascular and immune function, as well as mood and cognitive performance. Paying attention to the metrics that make up the sleep score can make a huge difference. </p><div><blockquote><p>“The future of medicine isn't replacing physicians with wearables — it's using wearables to help people recognize meaningful changes sooner and seek care before small problems become larger ones."</p><p>Dr. Manu Segal, medical director, The Moorings at Lewes</p></blockquote></div><p>Further to that point, <a href="https://www.veraclinic.net/our-doctors/dr-naheed-ali-md-phd/" target="_blank">Dr. Naheed Ali</a>, certified in clinical research by the <a href="https://www.nih.gov/" target="_blank">National Institutes of Health</a>, states that smart rings, such as the Oura Ring, are not diagnostic tools in themselves. </p><p>He says, “Their greatest value lies in identifying persistent deviations from your normal pattern… They're most effective when combined with healthy lifestyle habits, regular medical care, and attention to the whole person — not just individual numbers.”</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ey4nbX"></div>                            </div>                            <script src="https://kwizly.com/embed/ey4nbX.js" async></script><h2 id="noticing-the-pattern">Noticing the pattern</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4836px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="bVDw2LytSXrWXhnTTz7RUm" name="Oura Ring" alt="Oura Ring 5" src="https://cdn.mos.cms.futurecdn.net/bVDw2LytSXrWXhnTTz7RUm.jpg" mos="" align="middle" fullscreen="" width="4836" height="2720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Following that advice, it’s become abundantly clear that understanding my own baseline and what the deviations in those metrics mean makes a huge difference. But we shouldn’t be jumping to conclusions from this data. “Normal” looks different for everyone, and a medical professional should be your first port of call.</p><p>Considering metrics alongside how I’m feeling has made the biggest difference in my understanding of my body. It’s not just about why I’m feeling tired and run down, but taking in the bigger picture and being aware of daily changes I can make. </p><p>After looking at my ring’s metrics over time, I found that my HRV balance was declining, my resting heart rate was elevated, and my body temperature was unstable. That would often give me alerts on the Symptom Radar section of the Oura app, which lets you know when your biometrics are showing signs of strain.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="aDWiPA7HkPSM5UR4g3pQEm" name="Oura Ring" alt="Oura Ring app screenshots" src="https://cdn.mos.cms.futurecdn.net/aDWiPA7HkPSM5UR4g3pQEm.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">2025 health data collected in the Oura app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Oura)</span></figcaption></figure><p>After taking these metrics to the doctor and getting the relevant testing done, I found out that I have a fast heartbeat, also known as tachycardia. Since then, I’ve been able to work closely with health professionals to delve into the cause and make changes, including medication and more focused exercise plans to improve my metrics and get me back to feeling my best.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1510px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="W8SLd2ppUvLwRb9njcMVHm" name="Oura Ring" alt="Oura Ring app screenshots" src="https://cdn.mos.cms.futurecdn.net/W8SLd2ppUvLwRb9njcMVHm.jpg" mos="" align="middle" fullscreen="" width="1510" height="850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">2026 health data collected in the Oura app. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Oura)</span></figcaption></figure><p>As you can see from my updated 2025 metrics, taking time to slow down and recognize stressors in my life has vastly improved my health. Since using my ring for this purpose, I’ve been able to get back to hiking, restful nights of sleep, and generally quieting the anxieties I was experiencing daily. </p><p>I wholeheartedly recommend paying attention to your version of normal with a fitness tracker. Paying attention to my metrics has made a huge difference to my quality of life. </p><p>However, it’s paramount that you don’t jump to conclusions and make assumptions based on a few numbers; you should always seek advice about any health concerns you have from a medical professional.</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/wellness/i-wore-an-oura-ring-for-an-entire-year-heres-why-im-never-going-back-to-a-smartwatch"><strong>I wore an Oura Ring for an entire year — here’s why it's the best smart tech I have invested in</strong></a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-used-the-oura-ring-to-track-my-sleep-for-6-months-heres-how-im-now-getting-a-full-8-hours"><strong>I wore the Oura Ring for 6 months to track my sleep — and now I'm regularly getting 8 hours and feel so much better</strong></a></li><li><a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever"><strong>Oura Ring 5 review: I’ve worn the world’s smallest smart ring for a week, and it changes fitness tracking forever</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Exclusive: Garmin Cirqa PM says ‘it just felt like we had all of the pieces in place’ to launch a screen-free fitness tracker ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/exclusive-garmin-cirqa-pm-says-it-just-felt-like-we-had-all-of-the-pieces-in-place-to-launch-a-screen-free-fitness-tracker</link>
                                                                            <description>
                            <![CDATA[ I chatted with the product manager for the Garmin Cirqa to learn more about the design process, the decision to give it a physical button, the lack of GPS, and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">eopyZd43QU3ECxjJB8N5f5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sg3JXoV6C6r56Fnc9YzB6X-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Jul 2026 05:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 31 Jul 2026 14:16:36 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/sg3JXoV6C6r56Fnc9YzB6X-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin Cirqa]]></media:description>                                                            <media:text><![CDATA[Garmin Cirqa]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin Cirqa]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sg3JXoV6C6r56Fnc9YzB6X-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been wearing the new <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor">Garmin Cirqa</a>, a $199 screen-free and subscription-free fitness tracker for over a week, and while my <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">initial impressions</a> are mostly positive, burning questions about the device persist.</p><p>So, I reached out to Jill Kaiser, the lead product manager for the Garmin Cirqa, to learn more. Kaiser has been with the Kansas-based brand for a decade, and sees the Cirqa as her ‘baby.’ </p><p>One of Garmin’s more unusual wearables, our conversation touched on the value of customer feedback in the design process, how customization and comfort were also key pillars, why the Cirqa lacks an onboard GPS, and whether or not Garmin plans to roll out more screen-free wearables anytime soon.</p><h3 class="article-body__section" id="section-why-launch-a-screen-free-tracker"><span>Why launch a screen-free tracker?</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:5068px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sg3JXoV6C6r56Fnc9YzB6X" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/sg3JXoV6C6r56Fnc9YzB6X.jpg" mos="" align="middle" fullscreen="" width="5068" height="2851" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the biggest bits of info I gleaned from my chat with Kaiser: Garmin places a high value on user feedback and requests. </p><p>“We definitely are listening to our customers. We were looking at what our customers want,” says Kaiser. The Cirqa has “all of our training, all of our health metrics, everything that they are wanting in our other devices, just in an option that doesn't have a screen, that doesn't have that distraction for them.”</p><p>Garmin users have apparently been requesting a screen-free tracker for some time. So why launch one now, especially hot on the heels of the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a>, a device that promises many of the same features for half the cost?</p><p>“We've had quite a lot of customer feedback wanting a screenless product for some time, and so it's been on our radar, and [now] just felt like we had all of the pieces in place to be able to support this,” says Kaiser.</p><p>Of course, launching a successful screen-free wearable requires an equally successful, i.e., user-friendly companion app. Put another way, “there's a lot that goes into not having a screen on your wrist and just making sure that our ecosystem is built for it,” notes Kaiser.</p><h3 class="article-body__section" id="section-an-all-day-version-of-the-index-sleep-tracker"><span>An ‘all-day version’ of the Index sleep tracker</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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WtBsy3z4pD8Bpyf4cQ6VV6" name="TG Sleep Garmin Index Sleep Monitor" alt="Our sleep tech reviewer laying in bed with white sheets wearing purple jumper and the black Garmin Index Sleep Monitor on right arm" src="https://cdn.mos.cms.futurecdn.net/WtBsy3z4pD8Bpyf4cQ6VV6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Kaiser says to think of the Cirqa as an “all-day version” of Garmin’s screen-free <a href="https://www.tomsguide.com/wellness/sleep-tech/garmin-index-sleep-monitor-review">Index sleep tracker</a>. However, “from a feature standpoint and what it tracks, the Vivoactive line and the Venu line fit really nicely with [the Cirqa]. We brought in all of the training metrics that the latest Venu has,” says Kaiser. </p><p>This is to say, the Cirqa should be one mighty reliable and comprehensive holistic device, up there with the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a>. And unlike other popular screen-free trackers out there, the Cirqa has one design element that truly sets it apart from the pack: a physical button.</p><p>“We added a button onto the product because we know from customers that it's important to be able to have that quick start and stop without having to pull out the phone,” says Kaiser. Not only that, the Cirqa vibrates each time you press the button to confirm the action. </p><h3 class="article-body__section" id="section-users-can-really-dig-in-and-make-it-what-they-want"><span>‘Users can really dig in and make it what they want’  </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:4684px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="YDCri7XxMdmeimo7d9tfhd" name="GarminCirqa-02" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/YDCri7XxMdmeimo7d9tfhd.jpg" mos="" align="middle" fullscreen="" width="4684" height="2635" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Designed to appeal to a wide range of users, whether you’re a hardcore athlete or a first-time jogger, personalization is king when it comes to the Cirqa. </p><p>“There's just a lot of customization we built into this that a user can really dig in and make it what they want. If they want to see their battery life from the device, they can turn that on, and with a double tap, you can see an LED; if it's green, it means it's good to go,” says Kaiser. </p><p>That’s not all. “If you feel like you're missing [knowing] what time it is, we have hourly alerts that you can turn on, and it vibrates on the hour.” </p><p>By default, a single press of the buttons starts a generic workout tracking session; however, users can customize the action to begin any supported workout of their choosing. </p><p>“You can go into Garmin Connect and customize that button. If you're always going floor climbing, like doing stadium stairs, and you want those metrics, you can go in and change that so floor climb is the activity on your device,” notes Kaiser.  </p><p>Meanwhile, a long-press of the button turns on the broadcast heart rate function, while a triple-press forces the Cirqa into pairing mode.</p><h3 class="article-body__section" id="section-a-valuable-companion-to-your-garmin-watch"><span>A valuable companion to your Garmin Watch</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="w9ZVBojNpXhRMYs4thsM8Y" name="Garmin Forerunner 570" alt="Garmin Forerunner 570 on someone's wrist displaying the watch face" src="https://cdn.mos.cms.futurecdn.net/w9ZVBojNpXhRMYs4thsM8Y.jpg" mos="" align="middle" fullscreen="" width="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>What about users who already own a Garmin watch? Does the Cirqa have any value as a companion device? Yes! Users can specify a primary device in the Connect app. This is the one you plan to wear throughout the day and night.</p><p>So, if you’re someone who trains with a higher-end Garmin Fenix or Forerunner, but want something a little more wrist-friendly to wear to bed without sacrificing sleep and recovery insights, the Cirqa may be your answer. </p><p>Best of all, you don’t need to manually switch between devices; the Connect app is smart enough to sync data from whatever wearable you’re wearing/logging a workout with. </p><h3 class="article-body__section" id="section-how-to-train-your-cirqa"><span>How to train your Cirqa</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:4527px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="2P456f4tr6erhmBPEQbgEe" name="GarminCirqa-06" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/2P456f4tr6erhmBPEQbgEe.jpg" mos="" align="middle" fullscreen="" width="4527" height="2546" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>While a dedicated, customizable button to start and stop workouts is certainly handy, wouldn’t it be nice if your Garmin Cirqa automatically knew what workouts you were doing without any input from you? </p><p>Kaiser says that with a little bit of user guidance early on, you can train your Cirqa to do exactly that. You’ll just need to manually track those activities for the first week or two you wear the device; after that, it should start to automatically detect and track your go-to workouts. </p><p>“By you engaging with it and saying, yes, I did go for a walk, or no, I didn't go for a walk, I was actually doing something else, that is helping the system then learn and actually adapt to you,” says Kaiser. </p><p>I’m still testing Cirqa's auto workout detection out, and seeing as it's only been a week, I can't yet comment on its reliability. That said, I look forward to reporting my findings in the forthcoming Garmin Cirqa review. </p><h3 class="article-body__section" id="section-on-the-lack-of-onboard-gps"><span>On the lack of onboard GPS</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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zrwLhcy7pE9gHz99a3wDGf" name="GarminCirqa-v-FitbitAir-02" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/zrwLhcy7pE9gHz99a3wDGf.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>One question I keep hearing about the Garmin Cirqa is ‘why doesn’t it have GPS?’ According to Kaiser, a desire to keep the size and cost down, while maximizing battery life, is the answer. </p><p>“There's a lot of benefit that we can get from a battery standpoint, from a size standpoint of not having [GPS] in there. And so it went back to the user need. Yes, we know GPS is important, but from the phone, that still gets what our customers want,” says Kaiser.</p><h3 class="article-body__section" id="section-more-screen-free-trackers-to-come"><span>More screen-free trackers to come?</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:5025px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="J8gQGtirDrYBxfay2N35UX" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/J8gQGtirDrYBxfay2N35UX.jpg" mos="" align="middle" fullscreen="" width="5025" height="2827" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>So, now that Garmin has two screen-free wearables under its belt, can we expect more to come? “We're always going to continue to be looking at what we can do in this space,” says Kaiser. So, maybe yes, maybe no? </p><p>Ultimately, the Cirqa was designed to be, well, whatever you want it to be, assuming you want a screen-free tracker. “There's just a lot of customization that we built in,” says Kaiser. “Depending on what your needs are and what you're looking for. You're either not getting anything from it, where it's completely distraction-free, or it's adding a little bit of help throughout the day.” </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/wellness/fitness-trackers/i-walked-7-000-steps-with-the-garmin-cirqa-vs-fitbit-air-and-theres-a-clear-winner">I walked 7,000 steps with the Garmin Cirqa vs Fitbit Air — and there's a clear winner</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free">Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-ultrahuman-ceo-says-smart-rings-will-become-a-computer-on-the-body-with-the-ability-to-at-least-micro-think">Exclusive: Ultrahuman CEO says smart rings will 'become a computer on the body' with the ability 'to at least micro-think'</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve spent hundreds of hours testing all the smartwatches and trackers to launch this year — here’s the one I recommend to most people ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/ive-spent-hundreds-of-hours-testing-all-the-smartwatches-and-trackers-to-launch-this-year-heres-the-one-i-recommend-to-most-people</link>
                                                                            <description>
                            <![CDATA[ As a fitness editor, I’ve spent hundreds of hours testing tech this year, and we’re only in July. Here's what I recommend. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">RUgvrQ4ZRWNZZsjphRAH34</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Ucm6sXRLWKpEuumFtaNtEJ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 29 Jul 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &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/Ucm6sXRLWKpEuumFtaNtEJ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of the fitbit air, garmin cirqa, oura ring 5, apple watch 11 and garmin forerunner 170]]></media:description>                                                            <media:text><![CDATA[a photo of the fitbit air, garmin cirqa, oura ring 5, apple watch 11 and garmin forerunner 170]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of the fitbit air, garmin cirqa, oura ring 5, apple watch 11 and garmin forerunner 170]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Ucm6sXRLWKpEuumFtaNtEJ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As a fitness editor, I’ve spent hundreds of hours testing tech this year, and we’re only in July. Not a day goes by when I don’t have more than one fitness tracker strapped to a pulse point, and by now, my friends have stopped asking me why I’m wearing two watches (I think they’re just relieved I’ve not turned up to brunch wearing a chest strap…yet). </p><p>I often get asked which is the best tracker, and my answer is always, "It depends on who’s buying it." And while I stick by this answer — someone training for their seventh marathon, for example, would be looking for something completely different to someone getting back into fitness in their 60s — one tracker stands out this year, and it’s probably not what you’re expecting. </p><h2 id="why-the-fitbit-air-is-the-best-fitness-tracker-to-launch-so-far-this-year">Why the Fitbit Air is the best fitness tracker to launch so far this year </h2><p>Sure, I wouldn’t be without my <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring 5</a>, and I’ve been impressed by the tech packed into the affordable <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-forerunner-170-review-an-affordable-and-accurate-running-watch">Garmin Forerunner 170</a>, but for me, the <a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-wearing-the-new-fitbit-air-for-5-days-and-this-is-the-one-thing-that-has-really-impressed-me-so-far">Fitbit Air </a>is the tracker to beat in 2026. If you’re looking to get a better understanding of your overall health, and you’re not put off by AI health coaches, here’s why it’s my top pick.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3341px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Mimn2jQmsFeajNnNQ8NWGU" name="IMG_7880" alt="a photo of the Fitbit Air on the wrist" src="https://cdn.mos.cms.futurecdn.net/Mimn2jQmsFeajNnNQ8NWGU.jpg" mos="" align="middle" fullscreen="" width="3341" height="1879" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h3 class="article-body__section" id="section-it-disappears-on-your-wrist"><span>It disappears on your wrist </span></h3><p>Whether you’re the kind of person who wears an actual watch (remember those) and wants a screenless tracker as well, or you’d prefer not to have something buzzing on your wrist with your phone notifications, the Fitbit Air is a great choice. Sure, it’s not as inconspicuous as the Oura Ring 5, but it’s also nowhere near as expensive, and if you don’t want to, you don’t have to sign up for an ongoing subscription. </p><p>Weighing in at just 12g, the Fitbit Air is seriously lightweight, and really does disappear on the wrist. I found it extremely comfortable wearing 24/7, especially when sleeping, and it was noticeably lighter than the <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a> or <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor">Garmin Cirqa</a>. </p><h3 class="article-body__section" id="section-the-ai-health-coach-is-the-best-i-ve-used-so-far"><span>The AI Health Coach is the best I’ve used so far </span></h3><p>I’m very anti-AI health coaching, especially because, up until now, most of them have just regurgitated information I can already see (don’t get me started on Apple’s Workout Buddy). I was skeptical about the Gemini-powered Google Health Coach on the Fitbit Air, but it really is excellent. </p><p>It breaks down your health information into easy-to-understand and actionable advice. This morning, after a heavy track session days before my period, my Google Health Coach told me, “That run was a solid effort, Jane, and since you’re in the luteal phase, your body is actually working harder than usual. During this time, your core temperature is naturally higher, and your body may prioritize burning fat over glycogen, which can make high-intensity efforts like today’s feel more draining.” </p><p>It then gave me three pillars to focus on to recover. </p><p>I’m lucky enough to have run with a coach for years, so I know my body and when I need to ease off. But for beginners, or those that need guidance, Google’s Health Coach does this super well, and the actionable advice can help you train smarter and avoid injury. </p><p>The downside is that to get this AI coaching, you’ll need to pay a subscription fee of $10/£8 per month. Still a lot cheaper than a running coach or personal trainer, but it won’t be a cost everyone can afford. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5020px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zCBBhA82yv8MGUKAmpHWt5" name="Fitbit-Air-lead" alt="Close-up of the sensors on the Fitbit Air" src="https://cdn.mos.cms.futurecdn.net/zCBBhA82yv8MGUKAmpHWt5.jpg" mos="" align="middle" fullscreen="" width="5020" height="2824" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><h3 class="article-body__section" id="section-for-most-people-the-fitbit-air-is-enough"><span>For most people, the Fitbit Air is enough</span></h3><p>I’ve worn a Garmin for years, and while I trust Garmin’s data and love the Garmin Connect app, the Garmin Cirqa is definitely aimed at more dedicated athletes who want deeper athletic training readiness metrics. Whoop takes this even more seriously with the Whoop 5.0. </p><p>That said, for most people, the data the Fitbit Air gives you is more than enough. I truly believe that with fitness trackers, you can take a horse to water, but you can’t make it drink. </p><p>There’s no point collecting months of data and not really doing anything with it. The power and change come when you can take the data and make healthy changes, and I believe the Fitbit Air is one of the best trackers I’ve tested when it comes to breaking down your data into actionable advice.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XkwQ3X"></div>                            </div>                            <script src="https://kwizly.com/embed/XkwQ3X.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/take-off-that-apple-watch-5-reasons-why-its-okay-to-swap-your-smartwatch-for-a-dumb-watch">I review smartwatches for a living, but these are 5 reasons why I sometimes still wear a 'dumb' watch</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch Series 12 rumors — everything we know so far</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/garmins-rumored-screen-less-wearable-just-might-be-the-subscription-free-whoop-rival-ive-been-waiting-for">Garmin’s rumored screen-less wearable just might be the subscription-free Whoop rival I’ve been waiting for</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Garmin Cirqa against a chest strap to see if its heart rate sensor is accurate — here’s the results ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/i-tested-the-garmin-cirqa-against-a-chest-strap-to-see-if-its-heart-rate-sensor-is-accurate-heres-the-results</link>
                                                                            <description>
                            <![CDATA[ I’ve done a variety of runs and strength workouts with the Garmin Cirqa to test its heart rate accuracy against a chest strap monitor, widely considered the gold standard for accuracy. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">btmixJ2PgDrh86uwjptLLN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/HgLvqKatpoHTmUxvYt3tjd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 29 Jul 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nick Harris-Fry ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/J5Jjp49GUVjLZEbjEkTex.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick has been a journalist since 2012 and has spent most of that time writing about health and fitness for a variety of publications. Nick spent nine years working on the Coach magazine and website before moving to the fitness team at Tom’s Guide in 2024. Nick is a keen runner and also the founder of YouTube channel &lt;a href=&quot;https://www.youtube.com/channel/UCOBM9FasII4dKbyE_HKkbjw&quot;&gt;The Run Testers&lt;/a&gt;, which specialises in reviewing running shoes, watches, headphones and other gear.&lt;/p&gt;&lt;p&gt;Nick has covered all aspects of health and fitness throughout his career, interviewing experts and celebrities, trying fitness classes and running marathons, all in the name of providing readers with the information they need to get the most out of an active lifestyle.&lt;/p&gt;&lt;p&gt;Nick ran his first marathon in 2016 after six weeks of training for a magazine feature and subsequently became obsessed with the sport. He now has PBs of 2hr 25min for the marathon and 15min 30sec for 5K, and has run 16 marathons in total, as well as a 50-mile ultramarathon.&lt;/p&gt;&lt;p&gt;Nick runs 60-90 miles a week and races regularly with his club, which gives him a lot of opportunity to test out running gear: he has tested and reviewed hundreds of pairs of running shoes, as well as fitness trackers, running watches, sports headphones, treadmills, and all manner of other kit. Nick is also a qualified Run Leader in the UK.&lt;/p&gt;&lt;p&gt;Nick is an established expert in the health and fitness area and along with writing for several publications, including &lt;a href=&quot;https://www.livescience.com/author/nick-harris-fry&quot;&gt;Live Science&lt;/a&gt;, &lt;a href=&quot;https://www.expertreviews.co.uk/authors/nick-harris-fry&quot;&gt;Expert Reviews&lt;/a&gt;, &lt;a href=&quot;https://www.wareable.com/author/n.harris-fry&quot;&gt;Wareable&lt;/a&gt;, &lt;a href=&quot;https://www.coachweb.com/author/nick-harris-fry&quot;&gt;Coach&lt;/a&gt; and &lt;a href=&quot;https://www.getsweatgo.com/author/n.harrisfry&quot;&gt;Get Sweat Go&lt;/a&gt;, he has been quoted on &lt;a href=&quot;https://www.theguardian.com/thefilter/2024/oct/20/if-you-pay-more-than-4-youre-being-ripped-off-the-fair-price-for-14-everyday-items-from-cleaning-spray-to-olive-oil&quot;&gt;The Guardian&lt;/a&gt; and &lt;a href=&quot;https://www.independent.co.uk/life-style/health-and-families/london-marathon-2021-date-training-tips-summer-running-a9482486.html&quot;&gt;The Independent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Nick graduated from the University of York in 2010 with a degree in Politics, Philosophy and Economics and worked in the NHS for three years, during which time he completed his NCTJ Diploma in Journalism at News Associates in London. Before starting on Coach and moving into health and fitness, Nick worked as a football journalist and lived in Kathmandu, Nepal for two years.&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/HgLvqKatpoHTmUxvYt3tjd-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin Cirqa]]></media:description>                                                            <media:text><![CDATA[Garmin Cirqa]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin Cirqa]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/HgLvqKatpoHTmUxvYt3tjd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The heart rate sensor on the <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">Garmin Cirqa</a> screen-free tracker powers pretty much all the important stats you get from the device. It’s key to sleep tracking, your body battery and training readiness scores, and your heart rate variability readings.</p><p>So it must be accurate, especially as, unlike with the <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">best Garmin watches</a>, you can’t pair an external heart rate monitor to the Cirqa to get more accurate data if required.</p><p>That’s what I do with my <a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-wearing-the-garmin-forerunner-970-for-six-months-here-are-my-long-term-pros-and-cons">Garmin Forerunner 970</a>, even though it has a pretty reliable optical heart rate sensor built into the watch. I pair the Garmin HRM 600 chest strap to the Forerunner 970 for my workouts, because chest straps offer an extra level of reliability.</p><p>Unlike optical sensors, which use LED lights to measure your heart rate via your blood, with your pulse changing the power of the light that comes back to the sensor, chest straps use electrical signals directly from the heart. They are more accurate and faster to respond to changes in heart rate.</p><h2 id="testing-the-garmin-cirqa-s-heart-rate-accuracy">Testing the Garmin Cirqa’s heart rate accuracy</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5025px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="J8gQGtirDrYBxfay2N35UX" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/J8gQGtirDrYBxfay2N35UX.jpg" mos="" align="middle" fullscreen="" width="5025" height="2827" attribution="" endorsement="" 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 Cirqa uses Garmin’s Elevate Gen 4 sensor, which is not the latest sensor in the brand’s line-up — most of its watches now use an Elevate Gen 5 sensor, but Garmin told us this was too large for the Cirqa at the launch of the strap.</p><p>Having spent the last couple of months testing the <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-forerunner-170-review-an-affordable-and-accurate-running-watch">Garmin Forerunner 170</a>, which also uses the Elevate Gen 4 sensor but has been accurate in my testing, I wasn’t concerned that it would lead to poorer results with the Cirqa.</p><p>I’ve had the Garmin Cirqa on my wrist for a couple of days, and to check the heart rate accuracy of the device, I’ve done two interval running sessions on the track, an easy run, and a strength workout. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4628px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Sz66aC4gmBMdzZqc43be2d" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/Sz66aC4gmBMdzZqc43be2d.jpg" mos="" align="middle" fullscreen="" width="4628" height="2603" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I don’t yet have the bicep band accessory for the Cirqa, but I have tested it on my wrist and on my forearm. In general, optical sensors like this are more accurate in thicker parts of the body where there’s more muscle, and the higher up the arm, the more stable the sensor tends to be. </p><p>The forearm is usually a little better than the wrist, and the upper arm is better still, so the bicep band could well be a worthy extra purchase if you pick up the Cirqa.</p><h2 id="top-marks-on-my-easy-run">Top marks on my easy run</h2><p>First up, the easiest test I’ve done so far with the Cirqa — a 40-minute easy run. I’ve rarely seen errors from Garmin watches during this kind of run in recent years, so I expected the Cirqa to match up with the Garmin HRM 600 chest strap more or less perfectly. I wore it on my forearm for this test.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:29.90%;"><img id="JuXZiDKxBwTRTF8CVuqYSL" name="HR Graph" alt="HR Graph for Garmin Cirqa testing" src="https://cdn.mos.cms.futurecdn.net/JuXZiDKxBwTRTF8CVuqYSL.png" mos="" align="middle" fullscreen="" width="1920" height="574" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DC Rainmaker Analyzer)</span></figcaption></figure><p>As you can see from the graph (created with the <a href="https://analyze.dcrainmaker.com/" target="_blank" rel="nofollow">DC Rainmaker Analyzer</a>), the Cirqa matched the chest strap beat-for-beat throughout the run and ended up with an average heart rate of 111.39bpm vs. 111.50 bpm on the chest strap. Flying colors.</p><h2 id="impressive-during-intervals">Impressive during intervals</h2><p>Interval runs are a tougher challenge for heart rate sensors because they have to track rapid rises and falls in heart rate. I did one session running 4 x 8min with 90 seconds recovery, and one with shorter intervals — 12 x 600m with 90 seconds recovery.</p><p>I’d expect to see a slight lag in the readings from the Cirqa compared to a chest strap, because the chest strap responds quicker to changes in heart rate, but otherwise I’d hope to see the same rise and fall in heart rate during the interval workouts.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:30.36%;"><img id="uniuQ4EkqGTBekWD8QHkWL" name="HR Graph" alt="HR Graph for Garmin Cirqa testing" src="https://cdn.mos.cms.futurecdn.net/uniuQ4EkqGTBekWD8QHkWL.png" mos="" align="middle" fullscreen="" width="1920" height="583" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DC Rainmaker Analyzer)</span></figcaption></figure><p>In the workout with longer intervals, the Cirqa was pretty much spot on when I was running hard, but didn’t drop as low as the chest strap between most of the intervals.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1357px;"><p class="vanilla-image-block" style="padding-top:43.77%;"><img id="967HqszYgBKyQrEs89U2WL" name="HR Graph" alt="HR Graph for Garmin Cirqa testing" src="https://cdn.mos.cms.futurecdn.net/967HqszYgBKyQrEs89U2WL.png" mos="" align="middle" fullscreen="" width="1357" height="594" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DC Rainmaker Analyzer)</span></figcaption></figure><p>When doing shorter reps, you can see that the Cirqa often took a little longer than the chest strap to rise to my higher heart rate when I started running hard, but it did track the rise and fall of my heart rate pretty well throughout the session.</p><p>I wore the Cirqa on my wrist throughout both these workouts, and overall I was impressed with the heart rate accuracy.</p><h2 id="mixed-results-during-a-strength-workout">Mixed results during a strength workout</h2><p>I wore the Cirqa on my forearm for the 15-minute strength workout I did, which was a mix of weights and bodyweight exercises done at a fairly slow pace, so my heart rate didn’t climb too high throughout.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:30.42%;"><img id="8NvR9GtG2dcV4aD67LGvYL" name="HR Graph" alt="HR Graph for Garmin Cirqa testing" src="https://cdn.mos.cms.futurecdn.net/8NvR9GtG2dcV4aD67LGvYL.png" mos="" align="middle" fullscreen="" width="1920" height="584" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DC Rainmaker Analyzer)</span></figcaption></figure><p>The Cirqa struggled more in this session than on the run, though the differences between it and the chest strap are exaggerated on the graph because it’s a shorter workout and my heart rate didn’t vary that much — the average heart rate measured by the Cirqa was 89.31 compared to 92.62 on the chest strap.</p><p>Still, it didn’t follow the reading from the chest strap that closely. I think for strength training, the bicep band would be a useful upgrade for the Cirqa.</p><h2 id="more-testing-to-come">More testing to come</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4821px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mU2g8T4Zd8QvZ9dWPKdnTX" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/mU2g8T4Zd8QvZ9dWPKdnTX.jpg" mos="" align="middle" fullscreen="" width="4821" height="2712" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It’s still early days in my testing of the Garmin Cirqa and I want to do a lot more workouts with it, trying out the bicep band in particular, but it has proved quite reliable overall so far.</p><p>Outside of workouts, I have little doubt the sensor is accurate, and the average and resting heart rate readings I’ve seen during sleep in my first two nights with the device look good, though I’ve not tested this against another sensor yet.</p><p>Whether a screen-free tracker is the right option for you also depends on a whole load of other factors, but the heart rate sensor on the Cirqa has been good for me so far.</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/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3">Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Is your old fitness tracker good enough? I tested a 5-year-old Fitbit vs Apple Watch Series 11 on a 5,500-step walk to find out ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/is-your-old-fitness-tracker-good-enough-i-tested-a-5-year-old-fitbit-vs-apple-watch-series-11-on-a-5-500-step-walk-to-find-out</link>
                                                                            <description>
                            <![CDATA[ Old Fitbit vs new Apple Watch: Can 2021's Fitbit Charge 5 keep up with the latest Apple Watch 11? The results speak for themselves. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bfEUrV6PtDX8VvvVjmEb7Q</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LT88KA37A9AFh3Q7DZVbBi-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 29 Jul 2026 05:38:40 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Jul 2026 14:23:41 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/LT88KA37A9AFh3Q7DZVbBi-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Fitbit Charge 5 next to the Apple Watch Series 11]]></media:description>                                                            <media:text><![CDATA[Close-up of the Fitbit Charge 5 next to the Apple Watch Series 11]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Fitbit Charge 5 next to the Apple Watch Series 11]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LT88KA37A9AFh3Q7DZVbBi-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Fitbit Charge 5 debuted in 2021 around the same time as the Apple Watch Series 7, and even though it was replaced by the Fitbit Charge 6 in 2023, you can still find the Charge 5 on sale in 2026 for around $100 new or ~$40 if you go the used/refurb route.</p><p>But can a 2021 wearable, like the <a href="https://www.tomsguide.com/reviews/fitbit-charge-5">Fitbit Charge 5</a>, <em>actually</em> keep up with today’s <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a>, like the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch Series 11</a>, when it comes to fitness tracking accuracy? I just had to find out.</p><div class="product star-deal"><a data-dimension112="7c2ca7fe-8ace-11f1-9aae-119a76dee7f8" data-action="Star Deal Block" data-label="Apple Watch Series 7" data-dimension48="Apple Watch Series 7" href="https://www.walmart.com/ip/Fitbit-Charge-5-Fitness-Tracker-Black-Graphite-Stainless-Steel/610462501" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:811px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="UFvoYwbkBxPZnseuhMHN73" name="charge 5 sqaure.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/UFvoYwbkBxPZnseuhMHN73.jpg" mos="" align="middle" fullscreen="" width="811" height="811" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fitbit Charge 5 is from 2021, debuting around the same time as the <a href="https://www.tomsguide.com/reviews/apple-watch-7" data-dimension112="7c2ca7fe-8ace-11f1-9aae-119a76dee7f8" data-action="Star Deal Block" data-label="Apple Watch Series 7" data-dimension48="Apple Watch Series 7" data-dimension25="">Apple Watch Series 7</a>. Still, by today's standards, it remains a competent little tracker boasting onboard GPS, a bright though small touchscreen, multiple days of battery life, and comprehensive holistic insights. <a class="view-deal button" href="https://www.walmart.com/ip/Fitbit-Charge-5-Fitness-Tracker-Black-Graphite-Stainless-Steel/610462501" target="_blank" rel="nofollow" data-dimension112="7c2ca7fe-8ace-11f1-9aae-119a76dee7f8" data-action="Star Deal Block" data-label="Apple Watch Series 7" data-dimension48="Apple Watch Series 7" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="7c2ca86c-8ace-11f1-9315-7b0d73363d1c" data-action="Deal Block" data-label="The Apple Watch 11 is Cupertino's flagship smartwatch and arguably one of the most feature-packed wearables on the market today, with impressive safety tools, smart features, holistic insights, and fitness-tracking chops, not to mention a bright screen and slim case." data-dimension48="The Apple Watch 11 is Cupertino's flagship smartwatch and arguably one of the most feature-packed wearables on the market today, with impressive safety tools, smart features, holistic insights, and fitness-tracking chops, not to mention a bright screen and slim case." data-dimension25="$" href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminum-Always/dp/B0FQFL8PZ5/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1270px;"><p class="vanilla-image-block" style="padding-top:118.11%;"><img id="GuyP4rEgTW2kHmRSjGeHCG" name="Apple Watch 11 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GuyP4rEgTW2kHmRSjGeHCG.jpg" mos="" align="middle" fullscreen="" width="1270" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Apple Watch 11 is Cupertino's flagship smartwatch and arguably one of the most feature-packed wearables on the market today, with impressive safety tools, smart features, holistic insights, and fitness-tracking chops, not to mention a bright screen and slim case.<a class="view-deal button" href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminum-Always/dp/B0FQFL8PZ5/" target="_blank" rel="nofollow" data-dimension112="7c2ca86c-8ace-11f1-9315-7b0d73363d1c" data-action="Deal Block" data-label="The Apple Watch 11 is Cupertino's flagship smartwatch and arguably one of the most feature-packed wearables on the market today, with impressive safety tools, smart features, holistic insights, and fitness-tracking chops, not to mention a bright screen and slim case." data-dimension48="The Apple Watch 11 is Cupertino's flagship smartwatch and arguably one of the most feature-packed wearables on the market today, with impressive safety tools, smart features, holistic insights, and fitness-tracking chops, not to mention a bright screen and slim case." data-dimension25="$">View Deal</a></p></div><p>While the Apple Watch Series 11 starts at roughly four times the cost of the Fitbit Charge 5 in today’s market, the two actually have a lot in common. Both sport AMOLED touchscreens — though the one on the Charge 5 is comically small — onboard GPS, heart rate monitors, blood oxygen sensors, and ECG capabilities. </p><p>More importantly, in terms of tracking an outdoor workout, you get nearly identical post-exercise stats, with insights into your distance, pace, climb, calories burned, heart rate max/average, and HR zones.</p><p>So, how did 2021’s Fitbit Charge 5 perform versus the 2026 flagship Apple Watch model? You can find the full results of my comparison below, followed by the five biggest takeaways from the test.</p><h3 class="article-body__section" id="section-old-fitbit-vs-new-apple-watch-walk-test-results"><span>Old Fitbit vs new Apple Watch: Walk test results </span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Apple Watch 11</p></th><th  ><p>Fitbit Charge 5</p></th><th  ><p>Control</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steps</strong></p></td><td  ><p>5,429 steps</p></td><td  ><p>5,473 steps</p></td><td  ><p>5,500 steps (manual count)</p></td></tr><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>2.83 miles</p></td><td  ><p>2.98 miles</p></td><td  ><p>2.87 miles (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Climb</strong></p></td><td  ><p>481 feet</p></td><td  ><p>324 feet</p></td><td  ><p>456 feet (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average pace </strong></p></td><td  ><p>18 mins 10 secs</p></td><td  ><p>17 mins 43 secs</p></td><td  ><p>18 mins 02 secs (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>125 bpm</p></td><td  ><p>120 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>156 bpm</p></td><td  ><p>149 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned</strong></p></td><td  ><p>400 calories</p></td><td  ><p>461 calories </p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Battery usage</strong></p></td><td  ><p>5%</p></td><td  ><p>14%</p></td><td  ><p>n/a</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-1-fitbit-s-step-count-tally-is-closer"><span>1. Fitbit's step count tally is closer</span></h3><p>Both the Fitbit Charge 5 and Apple Watch Series 11 calculated step count totals within 100 steps of my manual count (5,500 steps) and Strava's count (5,510 steps). This result is both impressive and well within a reasonable margin of error. </p><p>However, much to my surprise, the aging Fitbit proved slightly more accurate than Apple's latest at logging steps, besting the Series 11 by a small but noteworthy margin. </p><h3 class="article-body__section" id="section-2-apple-s-climb-data-is-far-more-accurate"><span>2. Apple's climb data is far more accurate</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:3066px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="wFrwtxB59iwVBRXoDsAHSA" name="fav-AW-apps" alt="Close up of the Apple Watch 11 on a user's wrist with the app icon screen displayed" src="https://cdn.mos.cms.futurecdn.net/wFrwtxB59iwVBRXoDsAHSA.jpg" mos="" align="middle" fullscreen="" width="3066" height="1725" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>In an effort to thoroughly test both wearables —  and to get my heart rate up —  this trek involved quite a lot of uphill effort. Unfortunately, the Fitbit Charge 5 struggled to log my climb accurately during this roughly 52-minute walk.</p><p>That effort is reflected in both Strava and Apple's post-workout reports, even if the Series 11 slightly inflated my climb (I'm not mad). </p><p>Assuming Strava's data is close to correct, which I suspect it is, the Charge 5's climb tally is 132 feet shy of the control, a disappointing result. </p><p>It's worth noting that the Fitbit Charge 5 lacks an onboard barometric altimeter, a sensor dedicated to monitoring elevation changes, while the Apple Watch 11 and my smartphone running Strava both sport one. </p><h3 class="article-body__section" id="section-3-fitbit-recorded-a-lower-heart-rate-but-more-calories-burned"><span>3. Fitbit recorded a lower heart rate but more calories burned</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="7N3Bhnn6vxEVyrmhioE7Bd" name="IMG_6245.jpg" alt="running mode on the Fitbit Charge 5" src="https://cdn.mos.cms.futurecdn.net/7N3Bhnn6vxEVyrmhioE7Bd.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/Tom's Guide)</span></figcaption></figure><p>The five-year-old Fitbit Charge 5 recorded a slightly lower average and max heart rate than the latest Apple Watch Series 11. Was the fact that I wore the Fitbit on my right wrist and the Apple Watch on my left a factor in this discrepancy? It shouldn't be. After all, both companion apps let you specify your wrist preference, which I did before this test.</p><p>Despite a lower heart rate, the Fitbit noted more calories burned overall than the Apple Watch. Then again, calorie counts are one of the smartwatch <a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-tested-over-100-fitness-trackers-head-to-head-3-workout-stats-i-trust-the-least">workout stats I trust the least</a>. </p><h3 class="article-body__section" id="section-4-the-fitbit-burned-through-way-more-battery"><span>4. The Fitbit burned through way more battery</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:1710px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="wrzUomuc26kJQFiJuSts4M" name="AW11-rumors-03" alt="The Apple Watch Series 10 on a user's wrist showing a colorful orange and pink home screen" src="https://cdn.mos.cms.futurecdn.net/wrzUomuc26kJQFiJuSts4M.jpg" mos="" align="middle" fullscreen="" width="1710" height="962" attribution="" endorsement="" 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 fitness tracking accuracy — minus climb data — from the five-year-old Fitbit Charge 5 is pretty similar to that of the current Apple Watch Series 11, one area the newer device easily outperforms the older generation is GPS battery life.</p><p>On paper, the Fitbit Charge 5 <em>should</em> outperform the Apple Watch 11 in terms of longevity; it's rated to last up to seven days per charge compared to just 24 hours for the Apple Watch.</p><p>However, over the course of tracking my 52-minute walk, the Charge 5 burned through nearly three times more battery than the Series 11. At this burn rate, I wouldn't trust the Charge 5 to log any outdoor workout longer than five or six hours, which means no epic hikes or snowboard sessions.</p><h3 class="article-body__section" id="section-5-the-charge-5-still-outperformed-my-expectations"><span>5. The Charge 5 still outperformed my expectations </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:4988px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="yoZ7L4XNwKc9D9EEH3HLSf" name="AW11-Charge5-01" alt="Close-up of the Fitbit Charge 5 next to the Apple Watch Series 11" src="https://cdn.mos.cms.futurecdn.net/yoZ7L4XNwKc9D9EEH3HLSf.jpg" mos="" align="middle" fullscreen="" width="4988" height="2806" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Ultimately, despite coming up a bit short in terms of climb data and battery performance, the five-year-old Fitbit Charge 5 exceeded my expectations compared to the current Apple Watch Series 11, proving to be nearly as good a fitness tracker, despite its age. </p><p>Which fitness trackers or smartwatches, new or old, would you like me to test head-to-head next? Let me know below.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZKDke"></div>                            </div>                            <script src="https://kwizly.com/embed/XZKDke.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 — and the winning margin was razor-thin</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Experts call Apple's new lease plan an attempt to 'mask the effect of rising hardware costs' ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/phones/iphones/experts-call-apples-new-lease-plan-an-attempt-to-mask-the-effect-of-rising-hardware-costs</link>
                                                                            <description>
                            <![CDATA[ Apple Upgrade is a new leasing program from the tech giant that lets you rent Apple devices for fixed terms. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ZU3aeASc6zYAaDx3mAynmX</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sTDBQSgzZKANHK3AZ4km5h-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Jul 2026 17:35:07 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[MacBooks]]></category>
                                                    <category><![CDATA[iPads]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Computing]]></category>
                                                    <category><![CDATA[Laptops]]></category>
                                                    <category><![CDATA[Tablets]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sTDBQSgzZKANHK3AZ4km5h-1280-80.jpg">
                                                            <media:credit><![CDATA[Eric Thayer/Getty Images]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple logo on building ]]></media:description>                                                            <media:text><![CDATA[Apple logo on building ]]></media:text>
                                <media:title type="plain"><![CDATA[Apple logo on building ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sTDBQSgzZKANHK3AZ4km5h-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Today <a href="https://www.apple.com/newsroom/2026/07/apple-upgrade-launches-in-the-united-states/" target="_blank">Apple announced</a> its new leasing program, Apple Upgrade which is undergirded by Klarna for iPhone, Apple Watch, Mac and iPad.</p><p>The program lets customers sign up for a plan, similar to how you would lease a car, for fixed 12-, 24- and 36-month terms depending on the device.  There are options to upgrade to a new device early or return it at the end of the lease.</p><p>Apple called the new plan a "more flexible way to pay for products."</p><p>It's possible this does offer some flexibility from paying an upfront lump sum or tying yourself to an onerous contract via a network carrier like Verizon or T-Mobile. </p><p>However, experts I spoke with think the Upgrade plan is meant to cover <a href="https://www.tomsguide.com/computing/hardware/sk-hynix-warns-2027-will-be-worst-year-for-ram-prices-right-as-a-damning-report-reveals-something-that-will-add-fuel-to-the-price-fixing-lawsuit">rising component costs</a>. </p><p>"By shifting the focus to lower monthly payments, it helps mask the effect of rising hardware costs and makes premium devices feel more affordable and attainable for a broader range of consumers," Jitesh Ubrani, a director at IDC, said. </p><p>They added that it could entice people who don't want to pay the higher upfront costs, as even <a href="https://www.tomsguide.com/computing/macbooks/for-first-time-since-1984-thinking-about-bailing-on-apple-customers-react-apple-price-hikes">Apple has hiked prices recently</a>. It also gives Apple a "steady stream of trade-ins" that the company can resell to expand its customer base.</p><p>"Many people are effectively leasing their phones already through carrier plans; leasing a watch or a Mac -- when you know that these are also devices that have upgrade cycles -- can make sense," Techsponential's Avi Greengart told Tom's Guide.  "it's still a lease, so you won't be able to use it until it dies unless you buy out the lease, and it may not be the absolute most economical approach."</p><p>Beyond upfront prices, is Apple Upgrade better for you? Let's take a look at how the program works.</p><h2 id="how-apple-upgrade-works">How Apple Upgrade 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:692px;"><p class="vanilla-image-block" style="padding-top:56.36%;"><img id="LAQo6BPWq3WqYSvFeCV5hY" name="Apple-Upgrade-hero_big.jpg.medium" alt="Apple Upgrade program" src="https://cdn.mos.cms.futurecdn.net/LAQo6BPWq3WqYSvFeCV5hY.jpg" mos="" align="middle" fullscreen="" width="692" height="390" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Apple Upgrade offers 12- or 24-month lease terms for eligible iPhones and Apple Watches. For those seeking a Mac or iPad, there are 24- or 36-month options. </p><p>Prices start as low as $11.99 per month for the Apple Watch and iPad, depending on size and storage capacity. iPhones start at $17.99, while Macs can be leased starting at $24.99 a month.</p><p>You can sign up online or at an Apple Store, where you will be approved by Klarna, which does require a soft credit check that should not impact your credit score. </p><p>At the end of the lease term, you can return the device or upgrade to a newer generation or purchase it with a one-time payment.</p><p>Compared to the outgoing iPhone Upgrade program, the Apple Upgrade Program does not include AppleCare, which is a separate subscription price and varies in price depending on your device.</p><p>Per <a href="https://www.macrumors.com/2026/07/28/apple-upgrade-program-klarna/" target="_blank">MacRumors</a>, if you miss a payment, it will be rolled into the next month's payment with no late fees. However, if you miss three consecutive payments, the lease will end, and you will have to pay the full outstanding balance, minus the value of the device when returned. If Klarna can't collect, a debt collection agency will be sent your information.</p><h2 id="apple-upgrade-prices">Apple Upgrade prices</h2><p>Apple is offering the entire iPhone 17 lineup, plus the iPhone Air, both the Apple Watch Series 11 and Apple Watch Ultra 3 and three iPad options, including the iPad Air, iPad Pro and iPad mini.</p><p>For Macs, you can lease the MacBook Air, MacBook Pro, iMac and Mac Studio. </p><p>Apple defaults to the 24-month leasing option, so we'll share that. The other options can lower or raise your price. Additionally, higher storage capacity or chip versions will also increase the monthly price.</p><p>Finally, the price does not include taxes and fees.</p><p>Here's how much the base model of each device will cost you. </p><div ><table><caption>Apple Upgrade Prices - iPhones and Watches</caption><thead><tr><th class="firstcol " ><p>Device</p></th><th  ><p>Upfront cost</p></th><th  ><p>Per month cost</p></th><th  ><p><strong>Total after 24 months</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>iPhone 17e</strong></p></td><td  ><p>$599</p></td><td  ><p>$17.99</p></td><td  ><p>$431.76</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone Air</strong></p></td><td  ><p>$999</p></td><td  ><p>$28.99</p></td><td  ><p>$695.76</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17</strong></p></td><td  ><p>$799</p></td><td  ><p>$22.99</p></td><td  ><p>$551.76</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro</strong></p></td><td  ><p>$1,099</p></td><td  ><p>$31.99</p></td><td  ><p>$767.76</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>$1,199</p></td><td  ><p>$34.99</p></td><td  ><p>$839.76</p></td></tr><tr><td class="firstcol " ><p><strong>Apple Watch Series 11</strong></p></td><td  ><p>$399</p></td><td  ><p>$11.99</p></td><td  ><p>$287.76</p></td></tr><tr><td class="firstcol " ><p><strong>Apple Watch Ultra 3</strong></p></td><td  ><p>$799</p></td><td  ><p>$24.99</p></td><td  ><p>$599.76</p></td></tr></tbody></table></div><p>We've separated the iPads and Macs out because these devices can have the longer 36-month term. Again, the prices below are for the base model of each device and the 24-month term.</p><div ><table><caption>Apple Upgrade Prices - Macs and iPads</caption><thead><tr><th class="firstcol " ><p>Device</p></th><th  ><p>Upfront cost</p></th><th  ><p>Per month cost</p></th><th  ><p><strong>Total after 24 months</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>iPad Air</strong></p></td><td  ><p>$749</p></td><td  ><p>$15.99</p></td><td  ><p>$383.76</p></td></tr><tr><td class="firstcol " ><p><strong>iPad Pro</strong></p></td><td  ><p>$1,199</p></td><td  ><p>$24.99</p></td><td  ><p>$599.76</p></td></tr><tr><td class="firstcol " ><p><strong>iPad mini</strong></p></td><td  ><p>$599</p></td><td  ><p>$11.99</p></td><td  ><p>$287.76</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Air</strong></p></td><td  ><p>$1,299</p></td><td  ><p>$24.99</p></td><td  ><p>$599.76</p></td></tr><tr><td class="firstcol " ><p><strong>MacBook Pro</strong></p></td><td  ><p>$1,999</p></td><td  ><p>$38.99</p></td><td  ><p>$935.76</p></td></tr><tr><td class="firstcol " ><p><strong>iMac</strong></p></td><td  ><p>$1,499</p></td><td  ><p>$28.99</p></td><td  ><p>695.75</p></td></tr><tr><td class="firstcol " ><p><strong>Mac Studio</strong></p></td><td  ><p>$2,499</p></td><td  ><p>$48.99</p></td><td  ><p>$1,175.76</p></td></tr></tbody></table></div><h2 id="no-leasing-entry-level-devices">No leasing entry-level devices</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XAXaMxrdpoER4r7t5G88jh" name="mac-mini-front.jpg" alt="New Mac mini just leaked — what you need to know" src="https://cdn.mos.cms.futurecdn.net/XAXaMxrdpoER4r7t5G88jh.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Jon Prosser & Ian Zelbo)</span></figcaption></figure><p>You may have noticed several Apple devices aren't eligible for the upgrade program. It includes the vanilla iPhone 16 and iPhone 16 Plus, as well as the entry-level models of almost every device category. </p><p>Here's the full list of Apple products you can't lease:</p><ul><li>iPhone 16</li><li>iPhone 16 Plus</li><li>Apple Watch SE</li><li>MacBook Neo</li><li>Mac mini</li><li>iPad (A16)</li><li>Studio Display</li></ul><h2 id="availability">Availability</h2><p>Apple Upgrade is available now for all of the listed devices. Apple says that a security deposit is not required and that a trade-in device could reduce monthly payments. </p><p>I will note that if you end a lease early, you could see termination fees. Also, if you don't do anything at the end of the lease, you'll be charged the purchase fee. </p><p>Lastly, hidden in the fine print, upgrading a device could increase your monthly payments, which is true for both higher-capacity versions of devices and more expensive models when new generations launch in the coming years.</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/wellness/fitness-trackers/we-asked-368-people-what-they-want-from-the-apple-watch-ultra-4-heres-the-resounding-answer-and-its-not-ai">We asked 368 people what they want from the Apple Watch Ultra 4. Here’s the resounding answer (and it’s not AI)</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-quietly-fixes-the-most-annoying-iphone-workaround-we-all-use">iOS 27 finally fixes the most annoying iPhone workaround we all use</a></li><li><a href="https://www.tomsguide.com/phones/iphones/new-iphone-20-video-reveals-the-8-biggest-upgrades-to-expect-from-the-20th-anniversary-iphone">New iPhone 20 video reveals the 8 biggest upgrades to expect from the 20th anniversary iPhone</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Garmin Cirqa vs Fitbit Air vs Whoop vs Oura Ring: Our fitness experts are helping you pick the perfect fitness tracker ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/join-our-wearable-tech-live-q-and-a-should-you-ditch-the-smartwatch-for-an-oura-whoop-garmin-cirqa-or-fitbit-air</link>
                                                                            <description>
                            <![CDATA[ Screen-free fitness trackers like the Fitbit Air, Garmin Cirqa, Oura Ring 5, and Whoop 4 are having a moment, but is screen-free really the best way to be? Before you buy one, let us give you a personalized recommendation. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">53Z3oLy4zJaBYLufS8vBim</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/mCSiFhfKDgUZYzgTiyH23K-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Jul 2026 09:54:50 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Jul 2026 19:01:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&gt;&lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Jeff Parsons ]]></dc:contributor>
                                                                    <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/mCSiFhfKDgUZYzgTiyH23K-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A hand holding the Apple Watch Ultra 3 and Fitbit Air, with a graphic reading &#039;Tom&#039;s Guide Live Q&amp;A&#039;]]></media:description>                                                            <media:text><![CDATA[A hand holding the Apple Watch Ultra 3 and Fitbit Air, with a graphic reading &#039;Tom&#039;s Guide Live Q&amp;A&#039;]]></media:text>
                                <media:title type="plain"><![CDATA[A hand holding the Apple Watch Ultra 3 and Fitbit Air, with a graphic reading &#039;Tom&#039;s Guide Live Q&amp;A&#039;]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/mCSiFhfKDgUZYzgTiyH23K-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Screen-free wearables like the Fitbit Air, Garmin Cirqa, Oura Ring 5 and Whoop 4 are having a moment, but is screen-free really the best way to be, especially when full-featured, hyper-connected devices like the Garmin Venu 4, Apple Watch 11 and Pixel Watch 4 exist?</p><p>That depends entirely on what you hope to get out of your wearable. I've already covered the five biggest things to consider before buying a <a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">screen-free wearable</a>. Now, we're here to help you further understand the core differences between the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> and fitness trackers and the top no-screen trackers, including the <a href="https://www.tomsguide.com/wellness/fitness-trackers/best-smart-rings">best smart rings</a> of 2026.</p><iframe class="position-center" data-lazy-priority="low" data-lazy-src=""></iframe><p>Howdy, I'm Dan Bracaglia, one of TG's resident experts on smartwatches, fitness trackers, and smart rings. I'm here to help you make sense of today's wearables market and even choose between two devices. </p><p>Got a burning question about the difference between the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-vs-fitbit-inspire-3-which-usd99-fitness-tracker-wins">Fitbit Air and Fitbit Inspire 3</a>? Are you deciding between the new <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-se-3-review">Apple Watch SE 3</a> and the new <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">Garmin Cirqa</a>, two devices surprisingly close in price? Not sure if the latest <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring 5</a> is right for you?</p><p>Responding to your questions are myself, <a href="https://www.tomsguide.com/author/dan-bracaglia">Dan Bracaglia</a>, a senior writer at TG and expert in wearables with nearly two decades of experience covering consumer technology, and TG's U.K editor-in-chief, <a href="https://www.tomsguide.com/author/jeff-parsons">Jeff Parsons</a>, who's not only an avid runner, but also an expert in consumer tech of all kinds. </p><p>Please make sure that all queries are related to wearable tech, specifically, screen vs screen-free trackers. We can't wait to answer your questions! You might also like to let us know your feelings about screen-free wearables in the poll below.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XkwQ3X"></div>                            </div>                            <script src="https://kwizly.com/embed/XkwQ3X.js" async></script><p>As a reminder, please keep all questions appropriate and on-topic. This is an open space where we hope to foster a positive, helpful environment for all readers, whether you're new to the world of fitness trackers or you're a hardcore athlete shopping for your fifth Garmin.</p><p>If you've never left a comment on our site before, then you may need to sign up to post your first question. It's free to sign up and will unlock a host of other <a href="https://www.tomsguide.com/membership">Tom's Club member benefits</a>, such as exclusive rewards and savings, the ability to earn badges and <a href="https://www.tomsguide.com/club-prizes">enter giveaways</a>, join in with <a href="https://www.tomsguide.com/tag/polls">popular conversations</a> and all <a href="https://www.tomsguide.com/tag/live-q-and-a">Live Q&As,</a> and reveal hints for our <a href="https://www.tomsguide.com/tag/quiz">quizzes and puzzles</a>.</p><p>We can't wait to hear from you — let us know what you'd like help with 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/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smart-rings/the-samsung-galaxy-ring-is-about-to-be-the-worlds-first-fda-cleared-smart-ring-for-sleep-apnea">The Samsung Galaxy Ring is about to be the world’s first FDA-cleared smart ring for sleep apnea</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-7-000-steps-with-the-garmin-cirqa-vs-fitbit-air-and-theres-a-clear-winner">I walked 7,000 steps with the Garmin Cirqa vs Fitbit Air — and there's a clear winner</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ We asked 368 people what they want from the Apple Watch Ultra 4. Here’s the resounding answer (and it’s not AI) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/we-asked-368-people-what-they-want-from-the-apple-watch-ultra-4-heres-the-resounding-answer-and-its-not-ai</link>
                                                                            <description>
                            <![CDATA[ We asked our readers what they wanted from a new Apple Watch Ultra ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">64xJJxr4qCvFY9Q3odn7yV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PA9zQrFpTmCsin4Zx4KXJR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Jul 2026 08:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &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/PA9zQrFpTmCsin4Zx4KXJR-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / Dan Bracaglia]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close up of the Apple Watch Ultra 3 in silver]]></media:description>                                                            <media:text><![CDATA[Close up of the Apple Watch Ultra 3 in silver]]></media:text>
                                <media:title type="plain"><![CDATA[Close up of the Apple Watch Ultra 3 in silver]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PA9zQrFpTmCsin4Zx4KXJR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Whether or not we see an <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-these-are-the-upgrades-apple-needs-to-make-to-remain-the-smartwatch-king">Apple Watch Ultra 4</a> launch this fall remains to be seen, but that hasn’t stopped us from asking the Tom’s Guide readers exactly what they want from a new watch. The <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-announced">Apple Watch Ultra 3</a> is one of the <a href="https://www.tomsguide.com/best-picks/best-apple-watch">best Apple watches</a> on the market — it’s built for adventure and packed with features.</p><p>Personally, as a female with a petite wrist, I’m dreaming of the day when Apple gives us the option to buy the Apple Watch Ultra in a smaller size. I love the Apple Watch Ultra 3 and find it is, by far, the best Apple Watch for running (here’s what happened when <a href="https://www.tomsguide.com/wellness/smartwatches/i-wore-an-apple-watch-and-a-garmin-for-the-london-marathon-heres-which-came-out-on-top">I used it for the London Marathon alongside the Garmin Forerunner 570</a>), but I find it uncomfortable to wear when sleeping. </p><p>But what did our readers have to say? We asked 368 people what they were hoping for from the next Apple Watch Ultra. Read on to find out more. </p><h3 class="article-body__section" id="section-1-better-battery-life-42"><span>1. Better battery life: 42% </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:2641px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="LJrw2jH4amRDyThhoTcAnV" name="IMG_4770 copy" alt="apple watch ultra 3 low power mode" src="https://cdn.mos.cms.futurecdn.net/LJrw2jH4amRDyThhoTcAnV.jpg" mos="" align="middle" fullscreen="" width="2641" height="1485" attribution="" endorsement="" 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 most overwhelming answer? A longer battery life. The Apple Watch Ultra 3 has the longest battery life of any Apple Watch — 42 hours in low power mode, but this still isn’t enough to compare to some of the <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">best Garmin watches</a> on the market. </p><p>156 people said they’d want a longer battery life from the Apple Watch Ultra 4, and I’d tend to agree. Even going a couple of days between charges would make all the difference, especially if you are using this watch on an outdoor adventure. </p><h3 class="article-body__section" id="section-2-thinner-lighter-case-20"><span>2. Thinner, lighter case: 20% </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:2010px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="F9XM6FgSxgc3eGgYx2TFpb" name="Apple Watch Ultra 2-2.jpg" alt="Apple Watch Ultra 2" src="https://cdn.mos.cms.futurecdn.net/F9XM6FgSxgc3eGgYx2TFpb.jpg" mos="" align="middle" fullscreen="" width="2010" height="1131" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>75 people agreed with me that the current Apple Watch Ultra 3 is pretty bulky on the wrist. A thinner, lighter case would make the watch more comfortable for 24/7 sleep tracking and suit those with smaller wrists. </p><h3 class="article-body__section" id="section-3-new-health-fitness-tracking-tools-20"><span>3. New health/fitness tracking tools: 20%</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:3332px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="JrqsNFHZVqLYKBKh7GNvaa" name="IMG_6248" alt="a photo of the Apple Watch Ultra 3" src="https://cdn.mos.cms.futurecdn.net/JrqsNFHZVqLYKBKh7GNvaa.jpg" mos="" align="middle" fullscreen="" width="3332" height="1874" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>72 people wanted to see new tools from the Apple Watch Ultra 4. What this looks like remains to be seen. There are rumors that an Apple Watch Ultra 4 could have a new "extreme mode," designed specifically for long-distance outdoor adventures. This would extend GPS tracking runtime and be great for multi-day ultramarathoners.</p><h3 class="article-body__section" id="section-4-new-unlock-method-6"><span>4. New unlock method: 6% </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="6xWxFmJRkMDPWa7YQ7zZ33" name="IMG_5005" alt="A photo of the Apple Watch Ultra 3" src="https://cdn.mos.cms.futurecdn.net/6xWxFmJRkMDPWa7YQ7zZ33.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>23 people agreed with my colleague, Dan Bracaglia, that a new unlock method would be handy. <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-these-are-the-upgrades-apple-needs-to-make-to-remain-the-smartwatch-king" target="_blank">Dan wrote</a>, “Passcodes never seemed like a great way to unlock an Apple Watch, which is why two separate <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch 12</a>/Ultra 4 rumors have me excited. One suggests that Apple's next-gen smartwatches will get forward-facing cameras for Face ID. The other hints that an under-the-display fingerprint scanner could make an appearance.</p><p>“Either of these methods would be a welcome change to punching in a code every time you want to use your Apple Watch, though I ultimately think that Face ID is the better option of the two.”</p><h3 class="article-body__section" id="section-5-something-else-5"><span>5. Something else: 5%</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:5195px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AMqXMgCRTh5i62TkWuREy4" name="AW-hike-app-02" alt="Close-up of the Apple Watch Ultra 3 showing the WorkOutDoors hiking app" src="https://cdn.mos.cms.futurecdn.net/AMqXMgCRTh5i62TkWuREy4.jpg" mos="" align="middle" fullscreen="" width="5195" height="2922" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>20 people weren’t quite sure what they were hoping for from a new Apple Watch Ultra 4, but they wanted Apple to wow them, and we can relate. </p><h3 class="article-body__section" id="section-6-brighter-screen-3"><span>6. Brighter screen: 3% </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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JbFC9qzhWat5BWnXc4DfdS" name="Apple Watch Ultra 3 Pride Luminance Face" alt="Apple Watch Ultra 3 Pride Luminance Face" src="https://cdn.mos.cms.futurecdn.net/JbFC9qzhWat5BWnXc4DfdS.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Only 11 people wanted a brighter screen with the new Apple Watch Ultra 4, and we’d tend to agree. The huge Apple Watch Ultra 3 screen is incredibly bright and easy to read in all weather conditions. If it’s not broken, don’t fix it, right? </p><h3 class="article-body__section" id="section-7-siri-ai-3"><span>7. Siri AI: 3%</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:3382px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="JTeddfzjbx2UyovN7qRPk4" name="IMG_6263" alt="Apple Watch Workout Buddy" src="https://cdn.mos.cms.futurecdn.net/JTeddfzjbx2UyovN7qRPk4.jpg" mos="" align="middle" fullscreen="" width="3382" height="1903" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>And finally, only 11 people cared about the rumored Siri AI coming to the Apple Watch Ultra 4. Do we actually want or need AI assistants on our wrists? According to the people voting in this poll, the answer is no. </p><p>Do you agree? Have your say and vote here: </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBzBKe"></div>                            </div>                            <script src="https://kwizly.com/embed/eBzBKe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3">Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I walked 7,000 steps with the Garmin Cirqa vs Fitbit Air — and there's a clear winner ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-walked-7-000-steps-with-the-garmin-cirqa-vs-fitbit-air-and-theres-a-clear-winner</link>
                                                                            <description>
                            <![CDATA[ Which screen-free fitness tracker is more accurate, the Fitbit Air or the Garmin Cirqa? I decided to find out by popping one on either wrist and logging a long walk. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LwQwWeoBCGf93yqLSoC9Ba</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/y55QpRXhUiM9N8DKrxbLSe-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 27 Jul 2026 11:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Jul 2026 14:01:24 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/y55QpRXhUiM9N8DKrxbLSe-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:description>                                                            <media:text><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/y55QpRXhUiM9N8DKrxbLSe-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Which new screen-free fitness tracker is more accurate, the Fitbit Air or the Garmin Cirqa? I decided to find out by popping one on either wrist and logging a long walk.</p><p>Even though the <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">Garmin Cirqa</a> is twice the cost of the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> — $199 vs $99 — these two trackers have a lot in common. Screen-free, your primary method for interacting with either is through the companion app. That said, the Cirqa also has one physical button to start and stop workouts.</p><p>More importantly, neither has onboard GPS, so both require you to bring your paired phone along when logging an outdoor workout so that they can piggyback off its location and elevation data. </p><p>Now, on to the test!</p><div class="product star-deal"><a data-dimension112="b4bf739a-87ad-11f1-b5bc-45577e1d0439" data-action="Star Deal Block" data-label="At $99, the screen-free Fitbit Air is a fantastic little fitness tracker that's super comfortable, long-lasting, and discreet. Kind of like a Fitbit Inspire 3 minus the display, it's one of my favorite wearables of 2026." data-dimension48="At $99, the screen-free Fitbit Air is a fantastic little fitness tracker that's super comfortable, long-lasting, and discreet. Kind of like a Fitbit Inspire 3 minus the display, it's one of my favorite wearables of 2026." href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMTZF3V/?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:794px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="UcGoezMNaNCCtsaSfVKrqL" name="Google Fitbit Air" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/UcGoezMNaNCCtsaSfVKrqL.jpg" mos="" align="middle" fullscreen="" width="794" height="794" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>At $99, the screen-free Fitbit Air is a fantastic little fitness tracker that's super comfortable, long-lasting, and discreet. Kind of like a Fitbit Inspire 3 minus the display, it's one of my favorite wearables of 2026.<a class="view-deal button" href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMTZF3V/?th=1" target="_blank" rel="nofollow" data-dimension112="b4bf739a-87ad-11f1-b5bc-45577e1d0439" data-action="Star Deal Block" data-label="At $99, the screen-free Fitbit Air is a fantastic little fitness tracker that's super comfortable, long-lasting, and discreet. Kind of like a Fitbit Inspire 3 minus the display, it's one of my favorite wearables of 2026." data-dimension48="At $99, the screen-free Fitbit Air is a fantastic little fitness tracker that's super comfortable, long-lasting, and discreet. Kind of like a Fitbit Inspire 3 minus the display, it's one of my favorite wearables of 2026." data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="b4bf741c-87ad-11f1-9865-cfcc6d58b1e4" data-action="Deal Block" data-label="The Garmin Cirqa is a screen-less fitness tracker with only a single button to start and stop workouts. Boasting up to ten days of battery and a lightweight design, it's Garmin's answer to the Whoop 5.0 and Fitbit Air." data-dimension48="The Garmin Cirqa is a screen-less fitness tracker with only a single button to start and stop workouts. Boasting up to ten days of battery and a lightweight design, it's Garmin's answer to the Whoop 5.0 and Fitbit Air." data-dimension25="$" href="https://www.amazon.com/Garmin-CIRQATM-Smart-Subscription-French/dp/B0H94C68DZ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:903px;"><p class="vanilla-image-block" style="padding-top:110.30%;"><img id="9hSH5VJVhpTbr5YMN8Adsm" name="Screenshot 2026-07-24 at 3.20.34 PM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9hSH5VJVhpTbr5YMN8Adsm.png" mos="" align="middle" fullscreen="" width="903" height="996" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Garmin Cirqa is a screen-less fitness tracker with only a single button to start and stop workouts. Boasting up to ten days of battery and a lightweight design, it's Garmin's answer to the Whoop 5.0 and Fitbit Air.<a class="view-deal button" href="https://www.amazon.com/Garmin-CIRQATM-Smart-Subscription-French/dp/B0H94C68DZ/" target="_blank" rel="nofollow" data-dimension112="b4bf741c-87ad-11f1-9865-cfcc6d58b1e4" data-action="Deal Block" data-label="The Garmin Cirqa is a screen-less fitness tracker with only a single button to start and stop workouts. Boasting up to ten days of battery and a lightweight design, it's Garmin's answer to the Whoop 5.0 and Fitbit Air." data-dimension48="The Garmin Cirqa is a screen-less fitness tracker with only a single button to start and stop workouts. Boasting up to ten days of battery and a lightweight design, it's Garmin's answer to the Whoop 5.0 and Fitbit Air." data-dimension25="$">View Deal</a></p></div><h3 class="article-body__section" id="section-fitbit-air-vs-garmin-cirqa-walk-test-rules"><span>Fitbit Air vs Garmin Cirqa: Walk test rules</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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zrwLhcy7pE9gHz99a3wDGf" name="GarminCirqa-v-FitbitAir-02" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/zrwLhcy7pE9gHz99a3wDGf.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>I manually counted 7,000 steps — using my <a href="https://www.amazon.com/SDARMING-Counters-Counting-Knitting-Coaching/dp/B0971CF137/" target="_blank" rel="nofollow">trusty $6 tally counter</a> to log every hundred — with the Fitbit Air on my left wrist and the Garmin Cirqa on my right wrist to determine which is the more accurate fitness tracker. </p><p>I also ran Strava on my iPhone 16 Plus for additional step count, distance, elevation, and pace data. For the Fitbit Air, I manually began a walking workout from the Google Health app. For the Garmin Cirqa, I started the workout by pressing the single button. This proved to be a mistake.</p><h3 class="article-body__section" id="section-fitbit-air-vs-garmin-cirqa-walk-test-results"><span>Fitbit Air vs Garmin Cirqa: Walk test results </span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Fitbit Air</p></th><th  ><p>Garmin Cirqa</p></th><th  ><p>Control</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steps</strong></p></td><td  ><p>6,990 steps</p></td><td  ><p>7,070 steps</p></td><td  ><p>7,000 steps (manual count)</p></td></tr><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>3.86 miles</p></td><td  ><p>not provided</p></td><td  ><p>3.86 miles (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Climb</strong></p></td><td  ><p>236 feet</p></td><td  ><p>not provided</p></td><td  ><p> 405 feet (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average pace </strong></p></td><td  ><p> 16 mins 17 secs</p></td><td  ><p>not provided</p></td><td  ><p>16 mins 35 secs (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>115 bpm</p></td><td  ><p>123 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>135 bpm</p></td><td  ><p>160 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned</strong></p></td><td  ><p>532 calories</p></td><td  ><p>464 calories </p></td><td  ><p>n/a</p></td></tr></tbody></table></div><p>It took me about one hour to walk 7,000 steps around sunny Seattle, Washington, a step count total that all three tracking methods came remarkably close to. For these tests, I consider any tally within 100 steps of my actual total to be outstanding. </p><p>Ultimately, the Fitbit Air undercounted by a mere ten steps, while the Garmin Cirqa overcounted by 70. Strava, meanwhile, overcounted by ten. </p><p>Unfortunately, because the Cirqa logged my efforts as a generic workout rather than an outdoor walk, it frustratingly didn't register any distance, climb, or pace data for this test.</p><p>The Fitbit Air, on the other hand, logged the same distance as Strava, which isn't too surprising given both are making use of the same GPS data. However, its climb data is seemingly waaaay off. This is <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-000-steps-with-the-fitbit-air-vs-pixel-watch-4-and-im-genuinely-shocked-by-the-results">neither the first</a> nor <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-apple-watch-11-vs-fitbit-air-and-theres-a-clear-winner">the second time</a> I've had an issue with climb data when it comes to the Air.</p><p>Fortunately, the Air's pace data is much more aligned with Strava's. </p><p>The lack of consistency between the Air and Cirqa for heart rate data is a tad concerning. Without control data, it's hard to say for sure which watch is more accurate in this regard, but I suspect it's the Garmin, given my walk involved quickly ascending several very steep hills, which definitely got the blood pumping.</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-vs-apple-watch-ultra-3-winner"><span>Samsung Galaxy Watch Ultra 2 vs Apple Watch Ultra 3: Winner </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:3615px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="V5bphk5nqaWqaTZMwFPFaL" name="IMG_0408" alt="a photo of the Fitbit Air and the Garmin Cirqa on the wrist" src="https://cdn.mos.cms.futurecdn.net/V5bphk5nqaWqaTZMwFPFaL.jpg" mos="" align="middle" fullscreen="" width="3615" height="2034" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Despite continuing to struggle with climb data, the Fitbit Air beats the Garmin Cirqa in this walk test head-to-head by a small but legit margin. This is similar to the results my colleague Jane discovered when she tested these two gadgets against one another in a <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-garmin-cirqa-and-fitbit-air-and-the-winner-is-clear">4,000-step comparison</a>.</p><p>Stay tuned for more testing and coverage of the Garmin Cirqa, including my full review, coming 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/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too">I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 — and the winning margin was razor-thin</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Garmin Cirqa waterproof test: Can the Garmin Cirqa survive 30 minutes in a foot of water? ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-submerged-the-new-garmin-cirqa-fitness-tracker-in-a-foot-of-water-for-30-mins-heres-what-happened</link>
                                                                            <description>
                            <![CDATA[ I tested the Garmin Cirqa's water resistance to confirm whether or not it can really survive extended periods in water. Here's what I learned. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">MvaupH7Hy5mX9BoPzMr6KB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YDCri7XxMdmeimo7d9tfhd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 26 Jul 2026 04:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Jul 2026 15:19:16 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/YDCri7XxMdmeimo7d9tfhd-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:description>                                                            <media:text><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YDCri7XxMdmeimo7d9tfhd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Can the new <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">Garmin Cirqa</a> fitness tracker survive being submerged in just over one foot of water for 30 minutes? As part of my forthcoming Cirqa review, I decided to find out.</p><p>Garmin promises 50 meters of water resistance for the new screen-free Cirqa fitness tracker, which should be more than enough to make it through this test unscathed, but is that actually the case? Read on.</p><div class="instagram-embed"><blockquote class="instagram-media"  data-instgrm-version="6" style="width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><p><a href="https://www.instagram.com/p/DbMPZj7yQKu/" target="_blank">A post shared by Tom's Guide Fitness (@tomsguidefitness)</a></p><p>A photo posted by  on </p></blockquote></div><h2 id="what-s-in-a-waterproof-rating">What’s in a waterproof rating?</h2><p><a href="https://www.tomsguide.com/wellness/smartwatches/smartwatch-water-resistance-ratings-explained">Waterproof ratings</a> for wearables can be tricky business. After all, a 50-meter water resistance rating doesn’t actually mean you can swim at a depth of 50 meters and expect the device to survive.</p><p>In reality, 50 meters of water resistance translates to protection from water incursions during brief-ish surface-level swims. Most smartwatch manufacturers, including <a href="https://support.apple.com/en-us/109522" target="_blank">Apple</a>, spell out these restrictions on their sites. </p><p><a href="https://www.garmin.com/en-US/legal/waterrating-definitions/" target="_blank">Garmin similarly</a> states that the Cirqa’s 50 meters of water resistance is enough for “splashes, rain or snow, showering, swimming, diving into water, and snorkeling.”</p><h2 id="garmin-cirqa-waterproof-test">Garmin Cirqa waterproof test</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4719px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="9xrPCYVjy4LGyZrnRc3Z3R" name="Cirqa-H20-01" alt="Close-up of the Garmin Cirqa fitness tracker being submerged in water to test its water resistance" src="https://cdn.mos.cms.futurecdn.net/9xrPCYVjy4LGyZrnRc3Z3R.jpg" mos="" align="middle" fullscreen="" width="4719" height="2655" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>For this Garmin Cirqa waterproof test, I placed the device at the bottom of a tall graduated cylinder and filled it until the water level was just over one foot. I then set my trusted darkroom timer for 30 minutes and waited.</p><p>Once the time was up, I fished the Cirqa out and inspected it. The fact that the sensor lights were flashing upon my retrieval was immediately a good sign that things seemed to be working properly. I then pressed the single button on the Cirqa — used to start and stop workout tracking without the app — to see if it would vibrate. It did.</p><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.23%;"><img id="xWeCs5CZwswWeoBNzs9fXR" name="Cirqa-H20-02" alt="Close-up of the Garmin Cirqa fitness tracker being submerged in water to test its water resistance" src="https://cdn.mos.cms.futurecdn.net/xWeCs5CZwswWeoBNzs9fXR.jpg" mos="" align="middle" fullscreen="" width="5712" height="3212" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Finally, I opened the Garmin Connect app, and sure enough, the Cirqa popped up and began syncing. So, yes, the Garmin Cirqa passed the official Tom’s Guide fitness tracking waterproof test with flying colors. It’s now more than 24 hours later, and the Cirqa is still functioning as it should. </p><p>One side note from this test: Unlike the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air's </a>quick-drying fabric strap, the Garmin Cirqa strap seems to retain water, which translates to a very long dry time. After this particular soaking, for example, the Cirqa strap was still damp nearly two hours later; hardly ideal.</p><p>Which smartwatch or wearable should I waterproof test next? Let me know below. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor">Garmin Cirqa Smart Band launch: Garmin debuts a screen-free Whoop and Fitbit Air competitor</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-garmin-cirqa-and-fitbit-air-and-the-winner-is-clear">I walked 5,000 steps with the Garmin Cirqa vs Fitbit Air — and the winner is clear</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-turned-the-galaxy-watch-ultra-2-into-a-fully-fledged-dive-computer-but-theres-a-catch">Samsung turned the Galaxy Watch Ultra 2 into a fully-fledged dive computer — but there’s a catch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The launch of the Garmin Cirqa is good news for all Garmin users — here’s why ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/the-launch-of-the-garmin-cirqa-is-good-news-for-all-garmin-users-heres-why</link>
                                                                            <description>
                            <![CDATA[ The Garmin Cirqa relies heavily on the Garmin Connect app as a screen-free tracker, so all Garmin users should benefit from upgrades to the app, which have already started. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JNk4Aggy8fBETBy6pzqXT4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/J8gQGtirDrYBxfay2N35UX-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 25 Jul 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nick Harris-Fry ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/J5Jjp49GUVjLZEbjEkTex.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick has been a journalist since 2012 and has spent most of that time writing about health and fitness for a variety of publications. Nick spent nine years working on the Coach magazine and website before moving to the fitness team at Tom’s Guide in 2024. Nick is a keen runner and also the founder of YouTube channel &lt;a href=&quot;https://www.youtube.com/channel/UCOBM9FasII4dKbyE_HKkbjw&quot;&gt;The Run Testers&lt;/a&gt;, which specialises in reviewing running shoes, watches, headphones and other gear.&lt;/p&gt;&lt;p&gt;Nick has covered all aspects of health and fitness throughout his career, interviewing experts and celebrities, trying fitness classes and running marathons, all in the name of providing readers with the information they need to get the most out of an active lifestyle.&lt;/p&gt;&lt;p&gt;Nick ran his first marathon in 2016 after six weeks of training for a magazine feature and subsequently became obsessed with the sport. He now has PBs of 2hr 25min for the marathon and 15min 30sec for 5K, and has run 16 marathons in total, as well as a 50-mile ultramarathon.&lt;/p&gt;&lt;p&gt;Nick runs 60-90 miles a week and races regularly with his club, which gives him a lot of opportunity to test out running gear: he has tested and reviewed hundreds of pairs of running shoes, as well as fitness trackers, running watches, sports headphones, treadmills, and all manner of other kit. Nick is also a qualified Run Leader in the UK.&lt;/p&gt;&lt;p&gt;Nick is an established expert in the health and fitness area and along with writing for several publications, including &lt;a href=&quot;https://www.livescience.com/author/nick-harris-fry&quot;&gt;Live Science&lt;/a&gt;, &lt;a href=&quot;https://www.expertreviews.co.uk/authors/nick-harris-fry&quot;&gt;Expert Reviews&lt;/a&gt;, &lt;a href=&quot;https://www.wareable.com/author/n.harris-fry&quot;&gt;Wareable&lt;/a&gt;, &lt;a href=&quot;https://www.coachweb.com/author/nick-harris-fry&quot;&gt;Coach&lt;/a&gt; and &lt;a href=&quot;https://www.getsweatgo.com/author/n.harrisfry&quot;&gt;Get Sweat Go&lt;/a&gt;, he has been quoted on &lt;a href=&quot;https://www.theguardian.com/thefilter/2024/oct/20/if-you-pay-more-than-4-youre-being-ripped-off-the-fair-price-for-14-everyday-items-from-cleaning-spray-to-olive-oil&quot;&gt;The Guardian&lt;/a&gt; and &lt;a href=&quot;https://www.independent.co.uk/life-style/health-and-families/london-marathon-2021-date-training-tips-summer-running-a9482486.html&quot;&gt;The Independent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Nick graduated from the University of York in 2010 with a degree in Politics, Philosophy and Economics and worked in the NHS for three years, during which time he completed his NCTJ Diploma in Journalism at News Associates in London. Before starting on Coach and moving into health and fitness, Nick worked as a football journalist and lived in Kathmandu, Nepal for two years.&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/J8gQGtirDrYBxfay2N35UX-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin Cirqa]]></media:description>                                                            <media:text><![CDATA[Garmin Cirqa]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin Cirqa]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/J8gQGtirDrYBxfay2N35UX-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Screen-free fitness trackers live and die on the strength of their apps. If you don’t have a screen to look at on the device itself, you have to dive into the app regularly to see your stats instead, and that data needs to be well-presented.</p><p>This has always been a strength for <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop</a>, has been a focus for the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> since launch, and it was a glaring weakness when the <a href="https://www.tomsguide.com/wellness/fitness-trackers/polars-screenless-fitness-tracker-has-arrived-heres-everything-you-need-to-know-about-the-whoop-rival">Polar Loop </a>screenless band launched, because the partner Polar Flow app wasn’t up to scratch.</p><p>Garmin just launched its first screenless tracker in the <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor">Cirqa band</a> and the reliance it will have on the Garmin Connect app is the reason why I think all Garmin users will benefit from the new launch, because it will prompt updates to the app.</p><h3 class="article-body__section" id="section-the-garmin-connect-app-could-be-better"><span>The Garmin Connect app could be better</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:3672px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="m4Cc6S5VPyqRuwT8GNdaKX" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/m4Cc6S5VPyqRuwT8GNdaKX.jpg" mos="" align="middle" fullscreen="" width="3672" height="2067" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve been using the <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">best Garmin watches</a> for the past 10 years and I can’t fault the devices themselves, which are always accurate, offer a wealth of data and useful smart features, and look good.</p><p>However, the Garmin Connect app is less impressive, despite improvements to the home screen over the past couple of years.</p><p>There’s a lot of data in the app, but it’s not always easy to find what you want — features I use regularly like the workout creator and route builder are buried beneath several settings menus.</p><p>Since I can see all the stats I want and make changes to most settings directly on my <a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-wearing-the-garmin-forerunner-970-for-six-months-here-are-my-long-term-pros-and-cons">Garmin Forerunner 970,</a> this hasn’t been a problem, but if you buy the Garmin Cirqa and need to use the Connect app for everything, it could be more frustrating.</p><h3 class="article-body__section" id="section-improvements-have-already-started"><span>Improvements have already started</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:3721px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AjoUYtagaC2cAqN6vVfqiW" name="Garmin Cirqa" alt="Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/AjoUYtagaC2cAqN6vVfqiW.jpg" mos="" align="middle" fullscreen="" width="3721" height="2093" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>To its credit, Garmin does make fairly regular updates to the Connect app and has already made a telling upgrade to the home screen with the launch of the Cirqa, adding an "Essentials" section to the top of the home screen.</p><p>This shows four key stats at a glance, including things like your sleep score, training readiness and HRV status. The kind of stats that have been put front and center with other screenless devices, like the Whoop and <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring</a>.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rZSZhsV5nj5bC4jLyAmtNZ" name="Garmin Connect Essentials" alt="Garmin Connect Essentials" src="https://cdn.mos.cms.futurecdn.net/rZSZhsV5nj5bC4jLyAmtNZ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The color-coded breakdown of these important stats immediately makes the home page more useful at a glance, and it’s a handy update for all Garmin users, not just those who have the Cirqa.</p><p>My hope as someone who uses Garmin watches is that the arrival of the Cirqa band will result in a continuing focus on Garmin Connect app improvements, to the benefit of all, so even if you have no interest in a screen-free band yourself, it’s worth celebrating if you’re a Garmin user.</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/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3">Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I walked 5,000 steps with the Garmin Cirqa vs Apple Watch 11. Here’s which came out on top ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-garmin-cirqa-vs-apple-watch-11-heres-which-came-out-on-top</link>
                                                                            <description>
                            <![CDATA[ We put Garmin's newest tracker head-to-head with the Apple Watch. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">msBKoEe4dqNkxNr7fvid8W</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vNCdwjy2tbNqERQooPESMf-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 25 Jul 2026 04:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &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/vNCdwjy2tbNqERQooPESMf-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of the Garmin Cirqa and Apple Watch 11]]></media:description>                                                            <media:text><![CDATA[a photo of the Garmin Cirqa and Apple Watch 11]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of the Garmin Cirqa and Apple Watch 11]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vNCdwjy2tbNqERQooPESMf-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you see me walking down the street and I start to cry, it’s probably because I’m doing a walk test for Tom’s Guide, and I’ve lost count. As you’ll know if you follow Tom’s Guide’s fitness desk, one of the first things we do when a new device drops is take it for a walk with another fitness tracker to see how well it does the basics. </p><p>This week, everyone is talking about the new <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">Garmin Cirqa</a>, Garmin’s $199 screenless fitness tracker, which looks set to take on the likes of <a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-wearing-the-new-fitbit-air-for-5-days-and-this-is-the-one-thing-that-has-really-impressed-me-so-far">Fitbit Air</a> and <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a>. It’s a subscription-free tracker with comprehensive workout and sleep insights, up to 10 days of battery, haptic feedback, and a single physical button. You can read our <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">early verdict on the Garmin Cirqa</a> here. </p><p>To find out more, I strapped it to my wrist alongside the Apple Watch 11, which isn’t screenless, but is one of the most popular smartwatches on the market. I’ve had the Series 11 on my wrist since it was released last September. The newest iteration of Apple’s most popular smartwatch has hypertension alerts and a sleep score to help you gain a deeper understanding of your overall health.</p>        <div class="featured_product_block featured_block_versus" data-id="9e051f02-86a3-11f1-9a93-e3c256a9071a">            <a href="https://www.garmin.com/en-US/p/1989182/" data-model-name="Cirqa" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:102.04%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/4evX7WqPWr9jhKZeqqaxnb.png" alt="Garmin, Cirqa"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Garmin</div>                    <div class="featured__title">Cirqa</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The Garmin Cirqa goes on sale on July 24 for $199; it comes in two sizes and four color options. It's water-resistant to 5 ATM, and has a 10-day battery life.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_versus" data-id="9e051f84-86a3-11f1-ac1b-d1fd1eb9c244">            <a href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminum-Always/dp/B0FQFL8PZ5" data-model-name="Apple Watch 11" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:118.11%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/GuyP4rEgTW2kHmRSjGeHCG.jpg" alt="Apple Watch 11"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Apple</div>                    <div class="featured__title">Watch Series 11</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The Apple Watch Series 11 is considered the best smartwatch on the market for most people. It's an extension of your iPhone on your wrist, with plenty of health tools loaded on board.</p></p>                </div>                            </div>        </div><p>But which was more accurate over 5,000 steps? Read on to find out more. </p><h2 id="i-walked-5-000-steps-with-the-garmin-cirqa-and-the-apple-watch-11-here-are-the-results">I walked 5,000 steps with the Garmin Cirqa and the Apple Watch 11 — here are the results </h2><p>If you’ve read one of my articles before, you’ll know that manually counting anything more than around 50 steps is out of my remit, so I rely on a trusty $5 clicker tool from <a href="https://www.tomsguide.com/uk/tag/amazon">Amazon</a>.</p><p>I manually click every time I take a step. For this test, I wore the Apple Watch 11 on my left wrist and the Garmin Cirqa on my right. Both watches count your steps using an internal accelerometer, which measures the swing of your arm.</p><p>Each swing counts for two steps, and it doesn’t matter whether you wear your watch on your dominant or non-dominant hand. It doesn’t matter if you walk with your hands in your pockets or holding a cup of coffee; the accelerometer should still measure your body’s movement. It does, however, make a difference if you’re pushing a stroller — no, Apple, I promise I haven’t done a 45-minute elliptical workout while trying to get my toddler to sleep.</p><p>As with all of the <a href="https://www.tomsguide.com/best-picks/best-apple-watch">best Apple Watches</a>, the Apple Watch 11 doesn’t tell you the number of steps you’ve taken during a specific workout; instead, you see an overall number of steps throughout the day. Probably because <a href="https://www.tomsguide.com/wellness/fitness/forget-10000-steps-researchers-say-this-is-way-more-important">steps aren’t actually that useful a metric</a>, but annoying for me when writing these articles. For this comparison, I downloaded a third-party Pedometer+ app onto my Apple Watch 11.</p><p>When I got home, I downloaded all the data. </p><div ><table><caption>Results</caption><tbody><tr><td class="firstcol " ><p>Manual recording: </p></td><td  ><p>5,500 steps</p></td></tr><tr><td class="firstcol " ><p>Garmin Cirqa: </p></td><td  ><p> 4,605 steps </p></td></tr><tr><td class="firstcol " ><p>Apple Watch 11:</p></td><td  ><p>5,148 steps</p></td></tr></tbody></table></div><p>As you can see, the Apple Watch got slightly closer to my actual step count than the Garmin Cirqa; however, I will caveat this slightly.  I had a major problem with the device in that it didn’t recognise the activity as a walk at all. Instead, when I synced the Cirqa to Garmin Connect, I just got a "45-minute workout," with no distance or steps included. </p><p>I’ve only been wearing the device for 48 hours, and Garmin has stressed it gets smarter the more it gets to know you. Instead, I had to look at my overall steps throughout the day and use the numbers from there. I wonder if the results would have been different if the walk had been recorded as a walk, or if I’d been wearing the tracker for months, as I have with the Apple Watch 11.</p><p>I’ll continue my testing and my step counting before I make my verdict. Watch this space! </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBzBKe"></div>                            </div>                            <script src="https://kwizly.com/embed/eBzBKe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-tested-over-100-fitness-trackers-head-to-head-3-workout-stats-i-trust-the-least">I’ve tested over 100 fitness trackers head-to-head — 3 workout stats I trust the least</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/3-reasons-why-google-should-make-an-oura-ring-alternative">It's time for a Fitbit Ring — 3 reasons why Google should make an Oura Ring alternative</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I walked 4,000 steps with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2 —  and the winning margin was razor-thin ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/i-manually-counted-4-000-steps-to-test-the-apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-2-and-samsung-wins-the-accuracy-battle-with-better-elevation-data-too</link>
                                                                            <description>
                            <![CDATA[ Which rugged smartwatch, the Apple Watch Ultra 3 or the Samsung Galaxy Watch Ultra 2, is the better device for tracking outdoor workouts? I decided to find out by manually counting 4,000 steps with one on either wrist. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">BiMtgUtLvXGBXkpBqnjd2m</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7RLoxSzFXxAzKQFchr6Qod-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 10:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 21:21:52 +0000</updated>
                                                                                                                                            <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/7RLoxSzFXxAzKQFchr6Qod-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:description>                                                            <media:text><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7RLoxSzFXxAzKQFchr6Qod-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Which rugged smartwatch, the Apple Watch Ultra 3 or the new Samsung Galaxy Watch Ultra 2, is the better device for tracking outdoor workouts and adventures? I decided to find out by manually counting 4,000 steps with one on either wrist.</p><p>Aside from the obvious — the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3</a> is for iOS users, and the <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Samsung Galaxy Watch Ultra 2</a> is for the Android faithful — these two smartwatches are remarkably evenly matched. Of course, they also track a whole lot of other, more exciting activities, <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-turned-the-galaxy-watch-ultra-2-into-a-fully-fledged-dive-computer-but-theres-a-catch">including scuba diving</a>, but for the sake of our comparison, I’m going to stick with a good old-fashioned walk.</p><p>With my manual count as the primary control for this comparison, as a control for distance, climb, and pace, we’ll rely on ol’ reliable, the Strava app. </p><p>Read on to find out which smartwatch came out on top in this fitness tracking accuracy showdown with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2.</p><div class="product"><a data-dimension112="ec4544dc-86d3-11f1-a981-5bfe34187f4c" data-action="Deal Block" data-label="The Apple Watch Ultra 3 is Cupertino's toughest-built, longest-lasting smartwatch designed with outdoor adventurers and athletes in mind. A bright screen, sleek case, and safety features galore add to its appeal." data-dimension48="The Apple Watch Ultra 3 is Cupertino's toughest-built, longest-lasting smartwatch designed with outdoor adventurers and athletes in mind. A bright screen, sleek case, and safety features galore add to its appeal." href="https://www.bestbuy.com/product/apple-watch-ultra-3-gps-cellular-49mm-titanium-case-with-black-alpine-loop-medium-black-2025/JJGCQL87VH" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jZmNn7NgmEcxvn6y45BBZX" name="Apple Watch Ultra 3 sq" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jZmNn7NgmEcxvn6y45BBZX.jpg" mos="" align="middle" fullscreen="" width="1600" height="1600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Apple Watch Ultra 3 is Cupertino's toughest-built, longest-lasting smartwatch designed with outdoor adventurers and athletes in mind. A bright screen, sleek case, and safety features galore add to its appeal.<a class="view-deal button" href="https://www.bestbuy.com/product/apple-watch-ultra-3-gps-cellular-49mm-titanium-case-with-black-alpine-loop-medium-black-2025/JJGCQL87VH" target="_blank" rel="nofollow" data-dimension112="ec4544dc-86d3-11f1-a981-5bfe34187f4c" data-action="Deal Block" data-label="The Apple Watch Ultra 3 is Cupertino's toughest-built, longest-lasting smartwatch designed with outdoor adventurers and athletes in mind. A bright screen, sleek case, and safety features galore add to its appeal." data-dimension48="The Apple Watch Ultra 3 is Cupertino's toughest-built, longest-lasting smartwatch designed with outdoor adventurers and athletes in mind. A bright screen, sleek case, and safety features galore add to its appeal." data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="ec454554-86d3-11f1-98bb-bb471e66fd35" data-action="Deal Block" data-label="The Galaxy Watch Ultra 2 is a massive, rugged smartwatch with a dive-ready design, a seriously bright display, 60+ hours of battery, and Google's fantastic Gemini AI voice assistant built-in." data-dimension48="The Galaxy Watch Ultra 2 is a massive, rugged smartwatch with a dive-ready design, a seriously bright display, 60+ hours of battery, and Google's fantastic Gemini AI voice assistant built-in." data-dimension25="$" href="https://www.bestbuy.com/product/samsung-galaxy-watch-ultra2-titanium-smartwatch-47mm-lte-titanium-silver-2026/JJGRF3FXV3/sku/6684221" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:757px;"><p class="vanilla-image-block" style="padding-top:106.87%;"><img id="Zb6a5zdmbxUdzpjQuWMEAj" name="galaxywatchUltra2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Zb6a5zdmbxUdzpjQuWMEAj.jpg" mos="" align="middle" fullscreen="" width="757" height="809" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy Watch Ultra 2 is a massive, rugged smartwatch with a dive-ready design, a seriously bright display, 60+ hours of battery, and Google's fantastic Gemini AI voice assistant built-in.<a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-watch-ultra2-titanium-smartwatch-47mm-lte-titanium-silver-2026/JJGRF3FXV3/sku/6684221" target="_blank" rel="nofollow" data-dimension112="ec454554-86d3-11f1-98bb-bb471e66fd35" data-action="Deal Block" data-label="The Galaxy Watch Ultra 2 is a massive, rugged smartwatch with a dive-ready design, a seriously bright display, 60+ hours of battery, and Google's fantastic Gemini AI voice assistant built-in." data-dimension48="The Galaxy Watch Ultra 2 is a massive, rugged smartwatch with a dive-ready design, a seriously bright display, 60+ hours of battery, and Google's fantastic Gemini AI voice assistant built-in." data-dimension25="$">View Deal</a></p></div><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-vs-apple-watch-ultra-3"><span>Samsung Galaxy Watch Ultra 2 vs Apple Watch Ultra 3</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:4885px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gJNJWDGLv8fd94rotU7zkd" name="GalaxyWatchUltra2-v-AWU3-02" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/gJNJWDGLv8fd94rotU7zkd.jpg" mos="" align="middle" fullscreen="" width="4885" height="2748" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Before diving into the results, here are the biggest differences between the Apple Watch Ultra 3, one of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> in 2026, and the Samsung Galaxy Watch Ultra 2 (review pending). For starters, the Apple Watch is $100 more than the Galaxy Watch, $799 vs $699.</p><p>The Galaxy Watch, meanwhile, boasts a brighter display, better battery life, and a genuinely useful onboard AI assistant that's backed by Gemini and accessible via a wrist raise.</p><p>Design-wise, I find the Apple Watch Ultra 3 to be a lot comfier than the Galaxy Watch Ultra 2. Not only is the Apple Watch thinner, but it's also narrower. That said, the two weigh roughly the same.</p><p>When it comes to logging workouts, Apple and Samsung's best are evenly matched. They each boast dual-band GPS for location tracking, barometric altimeters for elevation monitoring, accelerometers and gyroscopes for motion tracking, and tons of health sensors to monitor your heart rate, body temperature, calories burned, and more.</p><p>With that out of the way, on to the result of my 4,000-step walk test comparison with the Apple Watch Ultra 3 vs Samsung Galaxy Watch Ultra 2!</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-vs-apple-watch-ultra-3-walk-test-results"><span>Samsung Galaxy Watch Ultra 2 vs Apple Watch Ultra 3: Walk test results </span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Apple Watch Ultra 3</p></th><th  ><p>Control</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steps</strong></p></td><td  ><p>4,023 steps</p></td><td  ><p>3,924 steps</p></td><td  ><p>4,000 steps (manual count)</p></td></tr><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>2.09  miles</p></td><td  ><p>2.11 miles</p></td><td  ><p>2.17 miles (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Climb</strong></p></td><td  ><p>358 feet</p></td><td  ><p>372 feet</p></td><td  ><p>362 feet (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average pace </strong></p></td><td  ><p>17 mins 05 secs</p></td><td  ><p>17 mins 09 secs</p></td><td  ><p>16 mins 48 secs (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>128 bpm</p></td><td  ><p>130 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>160 bpm</p></td><td  ><p>158 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned</strong></p></td><td  ><p>237 calories</p></td><td  ><p> 299 calories </p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Battery usage</strong></p></td><td  ><p>3%</p></td><td  ><p>1%</p></td><td  ><p>n/a</p></td></tr></tbody></table></div><p>I took exactly 4,000 steps during my ~35-minute walk, a tally that's backed up by Strava, which also logged precisely 4K. As always, any step count total within 100 steps of my actual tally is considered excellent and well within a reasonable margin for error.</p><p>Both the Apple Watch Ultra 3 and Samsung Galaxy Watch Ultra 2 performed exceptionally well in this test, not just in terms of accurately counting my steps, but also logging distance, elevation gain, pace, and even heart rate.</p><p>Of course, when it comes to steps, the Galaxy Watch Ultra 2 beats the Apple Watch Ultra 3 by a modest margin compared to the control. The same goes for climb and pace. The Apple Watch, meanwhile, was a little bit closer to the control for distance.</p><p>Both devices registered roughly the same maximum and average heart rates, though the Apple Watch calculated more calories burned and used less battery to log my efforts. </p><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-vs-apple-watch-ultra-3-winner"><span>Samsung Galaxy Watch Ultra 2 vs Apple Watch Ultra 3: Winner </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:4797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="vHP2ZPZZ4Z6xQ2bKK5vYtZ" name="GalaxyWatchUltra2-06" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/vHP2ZPZZ4Z6xQ2bKK5vYtZ.jpg" mos="" align="middle" fullscreen="" width="4797" height="2698" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>By a teeny-tiny margin, the Samsung Galaxy Watch Ultra 2 gets a win versus its main competitor, the Apple Watch Ultra 3. Ultimately, though, both devices performed with impressive accuracy during this test, and I would not hesitate to use either to log my next workout, whether it's a walk around the neighborhood or a recreational dive in Puget Sound.</p><p>Stay tuned for my full Samsung Galaxy Watch Ultra 2 review, to be published soon. In the meantime, which smartwatches would you like to see me test the Galaxy Watch Ultra 2 against next? Let me know below. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">5 things to know about the new Samsung Galaxy Watch 9</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smart-rings/the-samsung-galaxy-ring-is-about-to-be-the-worlds-first-fda-cleared-smart-ring-for-sleep-apnea">The Samsung Galaxy Ring is about to be the world’s first FDA-cleared smart ring for sleep apnea</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I walked 5,000 steps with the Garmin Cirqa vs Fitbit Air — and the winner is clear ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-garmin-cirqa-and-fitbit-air-and-the-winner-is-clear</link>
                                                                            <description>
                            <![CDATA[ Our fitness editor put the two screenless trackers head-to-head ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">eAz3fqNVAzLDv2sLj8eM3Z</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/V5bphk5nqaWqaTZMwFPFaL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &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/V5bphk5nqaWqaTZMwFPFaL-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of the Fitbit Air and the Garmin Cirqa on the wrist ]]></media:description>                                                            <media:text><![CDATA[a photo of the Fitbit Air and the Garmin Cirqa on the wrist ]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of the Fitbit Air and the Garmin Cirqa on the wrist ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/V5bphk5nqaWqaTZMwFPFaL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’ve followed the Tom’s Guide fitness team for a while, you’ll know that one of the first things we do when a new device drops is take it for a walk test. Sure, most of the <a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-tested-over-100-fitness-trackers-head-to-head-3-workout-stats-i-trust-the-least">best fitness trackers</a> on the market are designed to do much more than just count your steps, but how well they handle the basics is often a good place to start. </p><p>Next on my list was the long-awaited <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0">Garmin Cirqa</a>, which was announced this week and launches on July 24 for $199. It’s Garmin’s new screenless tracker, designed to track your health and fitness stats without distractions or a monthly subscription.</p><p>The obvious device to compare it to was the <a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-wearing-the-new-fitbit-air-for-5-days-and-this-is-the-one-thing-that-has-really-impressed-me-so-far">Fitbit Air</a>, Google’s $99 screenless tracker, which launched earlier this year. They both track everything you’d expect: your steps, calories, heart rate, menstrual cycle, skin temperature, and sleep. Both have haptic alerts to wake you up, and tons of data to help you live a healthier lifestyle. Check out the <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-vs-fitbit-air-5-crucial-differences-you-need-to-know#mrfhud=true">main similarities and differences between the Garmin Cirqa and Fitbit Air</a> here. </p>        <div class="featured_product_block featured_block_versus" data-id="ae591c1a-869d-11f1-91b6-65245a5f8305">            <a href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV" data-model-name="Fitbit Air" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/UcGoezMNaNCCtsaSfVKrqL.jpg" alt="Google Fitbit Air"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Fitbit</div>                    <div class="featured__title">Air</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>With no screen, buttons, or alerts to distract you — plus nearly a week of battery — the Fitbit Air is as easy-going as it is affordable. It’s also one of the <a href="https://www.tomsguide.com/us/best-fitbit,review-3203.html">best fitness trackers </a>of the year.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_versus" data-id="ae591c92-869d-11f1-ad09-0f4eea890258">            <a href="https://www.garmin.com/en-US/p/1989182/" data-model-name="Cirqa" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:102.04%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/4evX7WqPWr9jhKZeqqaxnb.png" alt="Garmin, Cirqa"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Garmin</div>                    <div class="featured__title">Cirqa</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The Garmin Cirqa goes on sale on July 24 for $199; it comes in two sizes and four color options. It's water-resistant to 5 ATM, and has a 10-day battery life.</p></p>                </div>                            </div>        </div><p>As a control, I manually counted my steps using a $5 clicker tool from Amazon — the kind a bouncer would use to count people into a club in my twenties. Every time I took a step, I clicked, and when I got home, I checked my stats on the respective apps. One key difference was that I was able to use the button on the right-hand side of the Garmin Cirqa to start the activity, whereas I logged into the Google Health app to manually start my walk, but more on that below. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@tomsguide/video/7665079360898075918" data-video-id="7665079360898075918" 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="♬ Vlog Video work Fashionable BGM(847726) - Tsuyoshi_san" href="https://www.tiktok.com/music/Vlog-Video-work-Fashionable-BGM-847726-6860515009819052033">♬ Vlog Video work Fashionable BGM(847726) - Tsuyoshi_san</a></section>                    </blockquote></div>                <h2 id="i-walked-5-000-steps-with-the-garmin-cirqa-and-fitbit-air-and-the-winner-is-clear">I walked 5,000 steps with the Garmin Cirqa and Fitbit Air, and the winner is clear </h2><p>As mentioned above, for each step I took, I clicked. I wore the Garmin Cirqa and the Fitbit Air on the same wrist. Both record steps in the same way: using an internal accelerometer, which measures the swing of your arm.</p><p>Each swing counts for two steps, and it doesn’t matter whether you wear your watch on your dominant or non-dominant hand. It doesn’t matter if you walk with your hands in your pockets or holding a cup of coffee; the accelerometer should still measure your body’s movement.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4031px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="SUU3QyhmffqoZpGcFQfgb4" name="IMG_0406" alt="a photo of the Garmin Cirqa and the Fitbit air" src="https://cdn.mos.cms.futurecdn.net/SUU3QyhmffqoZpGcFQfgb4.jpg" mos="" align="middle" fullscreen="" width="4031" height="2267" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p><u><strong>Here are the results: </strong></u></p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Manual counter</strong></p></td><td  ><p>5,500 steps</p></td></tr><tr><td class="firstcol " ><p><strong>Garmin Cirqa</strong></p></td><td  ><p>4,605 steps</p></td></tr><tr><td class="firstcol " ><p><strong>Fitbit Air </strong></p></td><td  ><p>5,552 steps</p></td></tr></tbody></table></div><p>As you can see, the results are pretty clear: the Fitbit Air was pretty much spot on when it came to counting my steps. </p><p>That said, before we write the Garmin Cirqa off completely, I had a major problem with the device in that it didn’t recognize the activity as a walk at all. Instead, when I synced the Cirqa to Garmin Connect, I just got a "45-minute workout," with no distance or steps included. </p><p>I’ve only been wearing the device for 48 hours, and Garmin has stressed it gets smarter the more it gets to know you. Instead, I had to look at my overall steps throughout the day and use the numbers from there. I wonder if the results would have been different if the walk had been recorded as a walk, or if I’d been wearing the tracker for months, as I have with the Fitbit Air. </p><p>Either way, only overcounting by two steps is very impressive from the Fitbit Air. I’ll continue testing both alongside one another to help you decide which is the best screenless fitness tracker for you. Watch this space! </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBzBKe"></div>                            </div>                            <script src="https://kwizly.com/embed/eBzBKe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-tested-over-100-fitness-trackers-head-to-head-3-workout-stats-i-trust-the-least">I’ve tested over 100 fitness trackers head-to-head — 3 workout stats I trust the least</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/3-reasons-why-google-should-make-an-oura-ring-alternative">It's time for a Fitbit Ring — 3 reasons why Google should make an Oura Ring alternative</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Garmin Cirqa vs Fitbit Air: 5 crucial differences you need to know ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-vs-fitbit-air-5-crucial-differences-you-need-to-know</link>
                                                                            <description>
                            <![CDATA[ Here are the main differences you need to know about. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">W9Qh48knvwMyaskTUDDH98</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/V5bphk5nqaWqaTZMwFPFaL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &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/V5bphk5nqaWqaTZMwFPFaL-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of the Fitbit Air and the Garmin Cirqa on the wrist ]]></media:description>                                                            <media:text><![CDATA[a photo of the Fitbit Air and the Garmin Cirqa on the wrist ]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of the Fitbit Air and the Garmin Cirqa on the wrist ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/V5bphk5nqaWqaTZMwFPFaL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apparently, 2026 is the year of the screenless tracker. Forget about AMOLED screens and checking your rings; the world is moving to discreet devices that track your health with zero distractions. </p><p>Earlier this year, Google launched the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a>, a $99 screenless tracker that looked set to take on the likes of the <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a>. Tuesday saw the long-awaited release of the <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor">Garmin Cirqa</a> — Garmin’s latest tracker, which is also completely screen-free, and launching on July 24 for $199.</p><p>But how do the two devices compare? What are the main similarities and differences? I’ve got both on my wrist as I type, and while it’s too soon to give an honest verdict on which you should buy, here are the highlights. </p>        <div class="featured_product_block featured_block_versus" data-id="c315b0ba-8610-11f1-9cec-e35f1cbe810e">            <a href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV" data-model-name="Fitbit Air" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/UcGoezMNaNCCtsaSfVKrqL.jpg" alt="Google Fitbit Air"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Fitbit</div>                    <div class="featured__title">Air</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>With no screen, buttons, or alerts to distract you — plus nearly a week of battery — the Fitbit Air is as easy-going as it is affordable. It’s also one of the <a href="https://www.tomsguide.com/us/best-fitbit,review-3203.html">best fitness trackers </a>of the year.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_versus" data-id="c315b13c-8610-11f1-806c-45343cb8f545">            <a href="https://www.garmin.com/en-US/p/1989182/" data-model-name="Cirqa" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:102.04%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/4evX7WqPWr9jhKZeqqaxnb.png" alt="Garmin, Cirqa"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Garmin</div>                    <div class="featured__title">Cirqa</div>                                    </div>                <div class="subtitle__description">                                                            <p><p>The Garmin Cirqa goes on sale on July 24 for $199; it comes in two sizes and four color options. It's water-resistant to 5 ATM, and has a 10-day battery life.</p></p>                </div>                            </div>        </div><h2 id="garmin-cirqa-vs-fitbit-air-similarities">Garmin Cirqa vs Fitbit Air: Similarities </h2><h3 class="article-body__section" id="section-both-are-screenless"><span>Both are screenless </span></h3><p>By design, both of these trackers are screenless, material bands, designed to be worn 24/7 for constant health tracking. They both track everything you’d expect: your steps, calories, heart rate, menstrual cycle, skin temperature, and sleep. Both have haptic alerts to wake you up, and tons of data to help you live a healthier lifestyle. </p><h3 class="article-body__section" id="section-both-can-be-used-with-apple-or-android"><span>Both can be used with Apple or Android </span></h3><p>Both devices are compatible with Apple and Android devices. For the Fitbit Air, you’ll use the new Google Health app, and for the Garmin Cirqa, you’ll connect to the device using Garmin Connect. </p><h3 class="article-body__section" id="section-both-can-be-used-subscription-free"><span>Both can be used subscription-free</span></h3><p>More on this below, but on the surface, both devices don’t need an ongoing subscription for you to see your health data. Compared to Whoop and Oura, which both have monthly subscriptions, this is a big plus. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4031px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="SUU3QyhmffqoZpGcFQfgb4" name="IMG_0406" alt="a photo of the Garmin Cirqa and the Fitbit air" src="https://cdn.mos.cms.futurecdn.net/SUU3QyhmffqoZpGcFQfgb4.jpg" mos="" align="middle" fullscreen="" width="4031" height="2267" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h2 id="garmin-cirqa-vs-fitbit-air-differences">Garmin Cirqa vs Fitbit Air: Differences </h2><h3 class="article-body__section" id="section-price"><span>Price </span></h3><p>Let’s get into the differences and start with the $100 price difference. The Fitbit Air is $99/£85, whereas the Garmin Cirqa costs $199/£179. Both are still much cheaper than the <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0 </a>or the <a href="https://www.tomsguide.com/wellness/smart-rings/ive-worn-the-oura-ring-5-for-six-weeks-here-are-3-things-i-love-and-2-things-i-wish-i-could-change">Oura Ring 5</a>, but there’s still a big price difference between the two devices, and if you’re on a budget, the Fitbit Air is far more affordable. </p><p>Both can be used subscription-free, but there’s a slight difference in what you get without a subscription. The Garmin Cirqa gives you virtually all your performance and health metrics with no subscription required. Paying for Garmin Connect+ ($6.99 per month or $69.99 per year) gets you access to Garmin’s AI coach, nutrition plans and macro logging, and Garmin’s coaching plans. </p><p>The Fitbit Air gives you basic metrics like heart rate, basic sleep logs, and AFib alerts for free; however, some of the deeper sleep metrics, Gemini AI coach, which is excellent, plus your daily personalized readiness insights, are locked behind Google Health Premium. Google Health Premium costs $9.99 per month or $99 for the year.</p><h3 class="article-body__section" id="section-physical-buttons"><span>Physical buttons </span></h3><p>One big difference between the Garmin Cirqa and the Fitbit Air is that the former has a physical button, allowing you to start and stop a workout, rather than relying on auto workout recognition. </p><p>Garmin said this decision was based on the brand’s DNA and user base, who wouldn’t want to miss a second of their workout. I’ve only worn the Garmin Cirqa for two workouts so far, but I personally appreciate having the physical button because I am the exact user Garmin is talking about. </p><h3 class="article-body__section" id="section-size-and-comfort"><span>Size and comfort </span></h3><p>Another big difference between the two screenless trackers is the size and weight. The Fitbit Air is 12g with the band, which comes in one size. The pebble itself is 34.9mm tall, 17mm wide, and has a depth of 8.3mm. It really is tiny on the wrist, and is extremely comfortable, even when sleeping. </p><p>The Garmin Cirqa is noticeably larger. It comes in two sizes — small/medium or large/extra-large — and weighs 20-25g depending on the size of the band. The tracker itself is 46.9mm tall, 27.5mm wide, and 8.7mm thick. It definitely feels bigger on the wrist and is a lot bulkier under clothing or when sleeping.</p><h3 class="article-body__section" id="section-third-party-integrations"><span>Third-party integrations </span></h3><p>Another consideration if you’re using your screenless tracker to track your cycle is that Garmin can integrate your skin temperature data with apps like Natural Cycles to predict your ovulation date. This requires a separate Natural Cycles subscription. You can’t, at the time of writing, integrate the Fitbit Air with Natural Cycles. </p><h3 class="article-body__section" id="section-band-placement"><span>Band placement </span></h3><p>Both bands can also be worn around your biceps for tracking during team sports, or in the gym, where you might not want a band around your wrist. That said, for both you’ll need to buy another band. The Fitbit Air requires you to loop two bands together, and an additional band will cost $34.99/£34.99. The Garmin Cirqa requires you to buy the biceps loop for $59.99/£49.99.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBzBKe"></div>                            </div>                            <script src="https://kwizly.com/embed/eBzBKe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-tested-over-100-fitness-trackers-head-to-head-3-workout-stats-i-trust-the-least">I’ve tested over 100 fitness trackers head-to-head — 3 workout stats I trust the least</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/3-reasons-why-google-should-make-an-oura-ring-alternative">It's time for a Fitbit Ring — 3 reasons why Google should make an Oura Ring alternative</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just went hands-on with the Garmin Cirqa — and it strikes a near-perfect balance between the Fitbit Air and Whoop 5.0 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-just-went-hands-on-with-the-garmin-cirqa-and-it-strikes-a-near-perfect-balance-between-the-fitbit-air-and-whoop-5-0</link>
                                                                            <description>
                            <![CDATA[ I've been wearing the Garmin Cirqa for a day, and both Fitbit and Whoop should be worried. Here are the five most important things you should know about Garmin's new screen-free tracker. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">wmbYK73o2Z6C4FVd8wzTj5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FaAWGWXMofzA6kFrNZ8q2f-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/FaAWGWXMofzA6kFrNZ8q2f-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:description>                                                            <media:text><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Garmin Cirqa screen-free fitness tracker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FaAWGWXMofzA6kFrNZ8q2f-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Garmin has officially entered the screen-free fitness tracker/band wars with the debut of the new <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor">Garmin Cirqa</a>, a $199, subscription-free wearable with haptic feedback, up to ten days of battery, and a single button.</p><p>I’ve been wearing the Cirqa for just a few hours, but I can already say with some certainty that both Google/Fitbit and Whoop should be a bit worried. While the $99 <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> is aimed at enthusiasts and the subscription-only <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a> is geared more toward serious and pro athletes, the Garmin Cirqa seems to strike a delightful balance between the two, in terms of features, cost, and specs. </p><p>Here are the five biggest things you should know about the Garmin Cirqa based on my hands-on experience, including why it just might make my list of the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a> in 2026.</p><h3 class="article-body__section" id="section-garmin-cirqa-cheat-sheet"><span>Garmin Cirqa: Cheat sheet</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zrwLhcy7pE9gHz99a3wDGf" name="GarminCirqa-v-FitbitAir-02" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/zrwLhcy7pE9gHz99a3wDGf.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><ul><li><strong>Price: </strong>$199 with core feature subscription-free; the optional Garmin Connect+ plan is $6.99 a month or $69.99 a year</li><li><strong>Design:</strong> Screen-free, the Cirqa is a lightweight, plastic fitness tracker with a single button, haptic feedback, and... that's it; it's bigger and heavier than the Fitbit Air but smaller and lighter than the Whoop 5.0</li><li><strong>Health features:</strong> Comprehensive sleep reports, women's health tracking (with support for the Natural Cycles app), 24/7 heart rate monitoring, Sp02 readings, jet lag advisor</li><li><strong>Fitness features:</strong> Supports 80+ workout types with support for auto-workout tracking for popular exercises; users can manually start and stop a workout using the physical button</li><li><strong>Battery life:</strong> Garmin promises up to ten days per charge, a little less than the Whoop 5.0 (14 days) but more than the Fitbit Air (7 days)</li></ul><h3 class="article-body__section" id="section-garmin-cirqa-versus-competition"><span>Garmin Cirqa: Versus competition</span></h3><div ><table><caption>Fitbit Air vs Whoop 5.0 vs Amazfit Helio Strap</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Garmin Cirqa</p></th><th  ><p>Fitbit AIr</p></th><th  ><p>Whoop 5.0</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$199</p></td><td  ><p>$99</p></td><td  ><p>Free with subscription</p></td></tr><tr><td class="firstcol " ><p><strong>Subscription cost</strong></p></td><td  ><p>Optional; $6.99 a month or $69.99 a year</p></td><td  ><p>Optional; $9.99 a month or $99 per year</p></td><td  ><p>$199, $239 or $359 per year depending on tier </p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions (without strap)</strong></p></td><td  ><p>47 x 17 x 9 mm</p></td><td  ><p>35 x 17 x 8 mm</p></td><td  ><p>35  x 24  x 11 mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight (without strap)</strong></p></td><td  ><p>14.8 g</p></td><td  ><p>5.2 g</p></td><td  ><p>26.5 g</p></td></tr><tr><td class="firstcol " ><p><strong>Sensors</strong></p></td><td  ><p>Heart rate, SpO2, Skin temp, Accelerometer, Gyroscope</p></td><td  ><p>Heart rate, SpO2, Skin temp, Accelerometer, Gyroscope</p></td><td  ><p>Heart rate, SpO2, Skin temp, Accelerometer, Gyroscope</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance </strong></p></td><td  ><p>50 meters</p></td><td  ><p>50 meters</p></td><td  ><p>10 meters</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>10 days</p></td><td  ><p>7 days</p></td><td  ><p>14 days</p></td></tr><tr><td class="firstcol " ><p><strong>Compatibility </strong></p></td><td  ><p>Android, iOS</p></td><td  ><p>Android, iOS</p></td><td  ><p>Android, iOS</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-1-garmin-cirqa-cheaper-than-the-whoop-but-more-than-the-fitbit-air"><span>1. Garmin Cirqa: Cheaper than the Whoop but more than the Fitbit Air</span></h3><p>Priced at <a href="https://www.garmin.com/en-US/p/1989182/pn/010-04675-13/" target="_blank" rel="nofollow">$199 via Garmin direct</a>, the Garmin Cirqa is twice the cost of the <a href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV/" target="_blank" rel="nofollow">$99 Fitbit Air</a>, but still pretty affordable (for a Garmin). However, unlike Google, which sells additional Fitbit Air straps starting at $34.99, accessory straps for the Garmin Cirqa <a href="https://www.garmin.com/en-US/p/1989182/pn/010-04675-13/#accessories" target="_blank" rel="nofollow">start at $49.99</a>.</p><h3 class="article-body__section" id="section-2-garmin-cirqa-no-subscription-required"><span>2. Garmin Cirqa: No subscription required</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:4823px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PWCywxCHWcxWsTjDNRyNFe" name="GarminCirqa-04" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/PWCywxCHWcxWsTjDNRyNFe.jpg" mos="" align="middle" fullscreen="" width="4823" height="2713" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Similar to the Fitbit Air, the Garmin Cirqa is a one-and-done affair in terms of cost. Once you have it, all of the core health and fitness features are yours to use without the need to pon subscription. </p><p>However, for added insights and training advice, Garmin offers the Connect+ plan for $6.99 monthly or $69.99 annually. That's a better value than the Google Health Premium plan for the Fitbit Air, which will set you back  $9.99 a month or $99 a year. </p><p>Whoop takes a different approach to pricing, where users get the device itself on the house but pay a much higher annual subscription cost ranging from $199 to $359 depending on the tier. </p><h3 class="article-body__section" id="section-3-garmin-cirqa-bigger-than-the-air-but-still-light-and-comfy"><span>3. Garmin Cirqa: Bigger than the Air but still light and comfy</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:4637px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="y55QpRXhUiM9N8DKrxbLSe" name="GarminCirqa-v-FitbitAir" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/y55QpRXhUiM9N8DKrxbLSe.jpg" mos="" align="middle" fullscreen="" width="4637" height="2608" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Garmin Cirqa is bigger and heavier than the Fitbit Air, with a noticeably wider strap (24 mm vs 18 mm). Compared to the Whoop 5.0, it's roughly the same shape and size, but a whole lot lighter.</p><p>The Garmin Cirqa fabric strap is a tad scratchy for my liking, based on first impressions, but I am hoping it will soften a bit over time. Like the Whoop 5.0 and Fitbit Air, the device itself — a plastic case with a sensor array, status lamp and single button —  is protected by the strap. </p><p>Unlike the Fitbit Air, swapping one strap for another on the Garmin Cirqa is a pain in the butt. I had to use a dedicated watch spring bar tool to get the job done. The spring bars are also an oddly thin length, limiting third-party strap options. </p><h3 class="article-body__section" id="section-4-garmin-cirqa-no-gps-but-lots-of-holistic-insights-and-tracking-modes"><span>4. Garmin Cirqa: No GPS, but lots of holistic insights and tracking modes</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:5144px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Rr535PFKqQMmtZpT74z88e" name="GarminCirqa-03" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/Rr535PFKqQMmtZpT74z88e.jpg" mos="" align="middle" fullscreen="" width="5144" height="2893" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Garmin smartwatches and wearables offer some of the most comprehensive, subscription-free sleep insights around. And even though the Cirqa is not FDA-approved to detect potential signs of sleep apnea, it does monitor your breathing while you snooze, along with your heart rate, body temperature, and movement. </p><p>Users are greeted each morning with a numeric sleep score out of 100, along with detailed insights into sleep cycles, disturbances, and more. The Cirqa also boasts a skin temperature sensor, which is used for both women's health tracking and early illness detection. </p><p>In terms of fitness tracking, the Cirqa supports over 80 common workout types, including winter sports, team sports, and common gym workouts. Users can pre-program up to ten of their favorite activities for quick access in the Garmin Connect app. </p><p>Unlike the Fitbit Air or Whoop 5.0, manually starting a workout with the Cirqa doesn't require a trip to the app. Users can start and stop workout tracking with a press of the device's only button. Haptic feedback confirms when your efforts start and finish. You can additionally schedule vibration-based alarms in the companion app.</p><h3 class="article-body__section" id="section-5-garmin-cirqa-ten-days-of-battery"><span>5. Garmin Cirqa: Ten days of battery</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="vCMJJtMCFmBSUzqH45Ct5f" name="GarminCirqa-07" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/vCMJJtMCFmBSUzqH45Ct5f.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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Garmin says the Cirqa's battery should last up to ten days per charge, which puts its longevity squarely between the Fitbit Air at seven days and the Whoop 5.0 at 14 days.</p><p>With my official battery test underway, we should know soon whether or not the Cirqa lives up to its ten-day rating. Oh, and it uses the same exact charging cable as every other modern Garmin watch, something I love to see.</p><h3 class="article-body__section" id="section-garmin-cirqa-outlook"><span>Garmin Cirqa: 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:4684px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="YDCri7XxMdmeimo7d9tfhd" name="GarminCirqa-02" alt="Close-up of the Garmin Cirqa screen-free fitness tracker" src="https://cdn.mos.cms.futurecdn.net/YDCri7XxMdmeimo7d9tfhd.jpg" mos="" align="middle" fullscreen="" width="4684" height="2635" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>As noted in the title, the Garmin Cirqa seemingly strikes a compelling balance between the entry-level Fitbit Air and the pro-level Whoop 5.0. Like the Fitbit Air, it's reasonably priced and doesn't require a subscription. It's not quite as small or light as the Air, but it does have better battery life.</p><p>Like the Whoop 5.0, the Garmin Cirqa should easily last for over a week per charge, while delivering heady fitness, sleep, and workout recovery insights that go beyond what the Fitbit Air provides. </p><p>Stay tuned for my full review of the Garmin Cirqa screen-less fitness tracker. In the meantime, what are your thoughts on Garmin's latest wearable? Let me know in the comments below. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3">Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best Galaxy Watch 9 and Galaxy Watch Ultra 2 preorder deals: get Samsung's new smartwatches for free ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/best-galaxy-watch-9-and-galaxy-watch-ultra-2-preorder-deals-get-samsungs-new-smartwatches-for-free</link>
                                                                            <description>
                            <![CDATA[ The first batch of Galaxy Watch 9 and Galaxy Watch Ultra 2 preorder deals are here. From Amazon to Samsung, here are all the best preorder deals I recommend. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">x8WNAnaPLQ8wwGwZPnhgBS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FpmxavUWmszhYEmFs2HRdV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 21:13:21 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks&amp;nbsp;against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more.&amp;nbsp;He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/FpmxavUWmszhYEmFs2HRdV-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / Dan Bracaglia]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Watch Ultra 2 held in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Watch Ultra 2 held in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Watch Ultra 2 held in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FpmxavUWmszhYEmFs2HRdV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's been a busy day for Samsung. In addition to unveiling new foldable phones at <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">Galaxy Unpacked</a>, it also released the Galaxy Watch 9 ($379) and Galaxy Watch Ultra 2 ($699). The watches have received a $30 and $50 price increase, respectively. Fortunately, there are plenty of Galaxy Watch 9 and Galaxy Watch Ultra 2 deals you can get right now. </p><p>For example, you can get <a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa" target="_blank" rel="nofollow">up to $250 off the Galaxy Watch 9 at Samsung</a> with an eligible trade-in. (You can trade-in an older Samsung or Apple Watch). Or you can get <a href="https://www.samsung.com/us/watches/galaxy-watch-ultra2/buy/galaxy-watch-ultra2-47mm-titanium-silver-lte-sku-sm-l715uzsaxaa/" target="_blank" rel="nofollow">up to $250 off the Galaxy Watch Ultra 2 at Samsung</a> with trade-in. If you don't have a trade-in, you can also get a $100 instant credit. Both watches will be released on August 7. Below I've rounded up the best deals you can get right now. </p><h3 class="article-body__section" id="section-quick-links-galaxy-watch-ultra-2"><span>Quick Links: Galaxy Watch Ultra 2</span></h3><ul><li><strong>Samsung: </strong><a href="https://www.samsung.com/us/watches/galaxy-watch-ultra2/buy/galaxy-watch-ultra2-47mm-titanium-silver-lte-sku-sm-l715uzsaxaa/" target="_blank" rel="nofollow"><strong>up to $250 off w/ trade-in or $100 credit</strong></a></li><li><strong>Amazon: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow"><strong>for $699 w/ free $100 GC</strong></a><strong></strong></li><li><strong>T-Mobile: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>for $269 w/ new watch line</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/promo/samsung-galaxy-watch-offer" target="_blank" rel="nofollow"><strong>up to $250 off w/ trade-in + $100 gift card</strong></a></li></ul><h3 class="article-body__section" id="section-quick-links-galaxy-watch-9"><span>Quick Links: Galaxy Watch 9</span></h3><ul><li><strong>Samsung: </strong><a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-cream-bluetooth-sku-sm-l340nzeaxaa/" target="_blank" rel="nofollow"><strong>up to $250 off w/ trade-in</strong></a></li><li><strong>Amazon: </strong><a href="https://www.amazon.com/dp/B0H9BPZXZC" target="_blank" rel="nofollow"><strong>for $379 w/ free $50 GC</strong></a><strong></strong></li><li><strong>T-Mobile: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>free w/ new watch line</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/promo/samsung-galaxy-watch-offer" target="_blank" rel="nofollow"><strong>up to $250 off w/ trade-in + $50 gift card</strong></a></li></ul><figure class="inline-layout"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></figure><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-deals"><span>Galaxy Watch Ultra 2 deals</span></h3><div class="product"><a data-dimension112="48ff1a50-8610-11f1-8531-97a2ee83eb6b" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $269 w/ trade-in + new watch line @ T-Mobile" data-dimension48="Galaxy Watch Ultra 2: for $269 w/ trade-in + new watch line @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" 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:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch Ultra 2: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="48ff1a50-8610-11f1-8531-97a2ee83eb6b" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $269 w/ trade-in + new watch line @ T-Mobile" data-dimension48="Galaxy Watch Ultra 2: for $269 w/ trade-in + new watch line @ T-Mobile" data-dimension25=""><strong>for $269 w/ trade-in + new watch line @ T-Mobile</strong></a><br>T-Mobile is offering the Galaxy Watch Ultra 2 for $269 with trade-in and a new Watch Plan Plus. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="48ff1a50-8610-11f1-8531-97a2ee83eb6b" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $269 w/ trade-in + new watch line @ T-Mobile" data-dimension48="Galaxy Watch Ultra 2: for $269 w/ trade-in + new watch line @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="48ff1ab4-8610-11f1-87bc-33d6fcdbdf47" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: up to $250 off w/ trade-in @ Samsung" data-dimension48="Galaxy Watch Ultra 2: up to $250 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/watches/galaxy-watch-ultra2/buy/galaxy-watch-ultra2-47mm-titanium-silver-lte-sku-sm-l715uzsaxaa/" 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:55.95%;"><img id="YFnsbuxZypxrkdepxUH3h9" name="Samsung logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9.jpg" mos="" align="middle" fullscreen="" width="1312" height="734" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch Ultra 2: </strong><a href="https://www.samsung.com/us/watches/galaxy-watch-ultra2/buy/galaxy-watch-ultra2-47mm-titanium-silver-lte-sku-sm-l715uzsaxaa/" target="_blank" rel="nofollow" data-dimension112="48ff1ab4-8610-11f1-87bc-33d6fcdbdf47" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: up to $250 off w/ trade-in @ Samsung" data-dimension48="Galaxy Watch Ultra 2: up to $250 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $250 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $250 off its Galaxy Watch Ultra 2 with trade-in. Or you'll get a $100 credit with out trade-in. The watch features an 1.52-inch AMOLED display with 5,000 nits of brightness. There's also a new 'Vitals' dashboard with key metrics including heart rate, HRV, Sp02, body temp, and breath rate in one place. Battery life should also be better with its upgraded 800 mAh battery. In our <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2 review</a> we said it improves on its predecessor with better screen brightness and battery life. It can also finally compete with the likes of the Apple Watch Ultra 3 when it comes to diving.<a class="view-deal button" href="https://www.samsung.com/us/watches/galaxy-watch-ultra2/buy/galaxy-watch-ultra2-47mm-titanium-silver-lte-sku-sm-l715uzsaxaa/" target="_blank" rel="nofollow" data-dimension112="48ff1ab4-8610-11f1-87bc-33d6fcdbdf47" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: up to $250 off w/ trade-in @ Samsung" data-dimension48="Galaxy Watch Ultra 2: up to $250 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="48ff1b18-8610-11f1-b59c-036dc2ae39f3" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: up to $250 off w/ trade-in + $100 gift card @ Best Buy" data-dimension48="Galaxy Watch Ultra 2: up to $250 off w/ trade-in + $100 gift card @ Best Buy" href="https://www.bestbuy.com/site/promo/samsung-galaxy-watch-offer" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1331px;"><p class="vanilla-image-block" style="padding-top:68.52%;"><img id="yjsgCbZzcWDLMuhHtLHa7K" name="Best Buy deal block 2022.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yjsgCbZzcWDLMuhHtLHa7K.jpeg" mos="" align="middle" fullscreen="" width="1331" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch Ultra 2: </strong><a href="https://www.bestbuy.com/site/promo/samsung-galaxy-watch-offer" target="_blank" rel="nofollow" data-dimension112="48ff1b18-8610-11f1-b59c-036dc2ae39f3" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: up to $250 off w/ trade-in + $100 gift card @ Best Buy" data-dimension48="Galaxy Watch Ultra 2: up to $250 off w/ trade-in + $100 gift card @ Best Buy" data-dimension25=""><strong>up to $250 off w/ trade-in + $100 gift card @ Best Buy</strong></a><br>Best Buy is offering up to $250 off the Galaxy Watch Ultra 2 with trade-in. Additionally, Best Buy Plus or Total members will receive a $100 gift card. Membership <a href="https://www.bestbuy.com/site/electronics/best-buy-membership/pcmcat1679668833285.c?id=pcmcat1679668833285" target="_blank" rel="nofollow">plans start at $29/year at Best Buy</a>).<a class="view-deal button" href="https://www.bestbuy.com/site/promo/samsung-galaxy-watch-offer" target="_blank" rel="nofollow" data-dimension112="48ff1b18-8610-11f1-b59c-036dc2ae39f3" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: up to $250 off w/ trade-in + $100 gift card @ Best Buy" data-dimension48="Galaxy Watch Ultra 2: up to $250 off w/ trade-in + $100 gift card @ Best Buy" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="48ff1b7c-8610-11f1-8fb6-83b76c532601" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1265px;"><p class="vanilla-image-block" style="padding-top:86.72%;"><img id="2QaDFAJjvKSmp7DubftogQ" name="Galaxy Watch Ultra 2 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2QaDFAJjvKSmp7DubftogQ.jpg" mos="" align="middle" fullscreen="" width="1265" height="1097" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch Ultra 2: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow" data-dimension112="48ff1b7c-8610-11f1-8fb6-83b76c532601" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension25=""><strong>for $699 @ Amazon</strong></a><br>Amazon is offering a free $100 Amazon gift card when you buy your Galaxy Watch Ultra 2 at Amazon. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Ultra2-Titanium-Smartwatch/dp/B0H6NRPGT7" target="_blank" rel="nofollow" data-dimension112="48ff1b7c-8610-11f1-8fb6-83b76c532601" data-action="Deal Block" data-label="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension48="Galaxy Watch Ultra 2: for $699 @ Amazon" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-watch-9-deals"><span>Galaxy Watch 9 deals</span></h3><div class="product"><a data-dimension112="87d528d2-860b-11f1-99cb-2da0f7f74129" data-action="Deal Block" data-label="Galaxy Watch 9: up to $250 off w/ trade-in @ Samsung" data-dimension48="Galaxy Watch 9: up to $250 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-cream-bluetooth-sku-sm-l340nzeaxaa/" 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:55.95%;"><img id="YFnsbuxZypxrkdepxUH3h9" name="Samsung logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9.jpg" mos="" align="middle" fullscreen="" width="1312" height="734" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch 9: </strong><a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-cream-bluetooth-sku-sm-l340nzeaxaa/" target="_blank" rel="nofollow" data-dimension112="87d528d2-860b-11f1-99cb-2da0f7f74129" data-action="Deal Block" data-label="Galaxy Watch 9: up to $250 off w/ trade-in @ Samsung" data-dimension48="Galaxy Watch 9: up to $250 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $250 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $250 off its Galaxy Watch 9. It features an 1.34-inch display with 3,000 nits max brightness. There's also a 'Vitals' dashboard with key metrics including heart rate, HRV, Sp02, body temp, and breath rate. The 40mm Galaxy Watch 9 has a 390 mAh battery, whereas the 44mm Galaxy Watch 9 sports a 445 mAh battery. In our <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">Galaxy Watch 9 review</a>, we said it boasts a faster processor and better battery; however, the biggest upgrades come in the form of new health and fitness tracking tools.<a class="view-deal button" href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-cream-bluetooth-sku-sm-l340nzeaxaa/" target="_blank" rel="nofollow" data-dimension112="87d528d2-860b-11f1-99cb-2da0f7f74129" data-action="Deal Block" data-label="Galaxy Watch 9: up to $250 off w/ trade-in @ Samsung" data-dimension48="Galaxy Watch 9: up to $250 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="87d5297c-860b-11f1-ba4c-8b6e1a4c54ce" data-action="Deal Block" data-label="Galaxy Watch 9: free w/ trade-in + new watch line @ T-Mobile" data-dimension48="Galaxy Watch 9: free w/ trade-in + new watch line @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" 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:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch 9: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="87d5297c-860b-11f1-ba4c-8b6e1a4c54ce" data-action="Deal Block" data-label="Galaxy Watch 9: free w/ trade-in + new watch line @ T-Mobile" data-dimension48="Galaxy Watch 9: free w/ trade-in + new watch line @ T-Mobile" data-dimension25=""><strong>free w/ trade-in + new watch line @ T-Mobile</strong></a><br>T-Mobile is offering the Galaxy Watch 9 for free with trade-in and a new Watch Plan Plus. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="87d5297c-860b-11f1-ba4c-8b6e1a4c54ce" data-action="Deal Block" data-label="Galaxy Watch 9: free w/ trade-in + new watch line @ T-Mobile" data-dimension48="Galaxy Watch 9: free w/ trade-in + new watch line @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="87d52ad0-860b-11f1-9a8a-bf7294b52e2e" data-action="Deal Block" data-label="Galaxy Watch 9: up to $250 off w/ trade-in + $50 gift card @ Best Buy" data-dimension48="Galaxy Watch 9: up to $250 off w/ trade-in + $50 gift card @ Best Buy" href="https://www.bestbuy.com/site/promo/samsung-galaxy-watch-offer" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1331px;"><p class="vanilla-image-block" style="padding-top:68.52%;"><img id="yjsgCbZzcWDLMuhHtLHa7K" name="Best Buy deal block 2022.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yjsgCbZzcWDLMuhHtLHa7K.jpeg" mos="" align="middle" fullscreen="" width="1331" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch 9: </strong><a href="https://www.bestbuy.com/site/promo/samsung-galaxy-watch-offer" target="_blank" rel="nofollow" data-dimension112="87d52ad0-860b-11f1-9a8a-bf7294b52e2e" data-action="Deal Block" data-label="Galaxy Watch 9: up to $250 off w/ trade-in + $50 gift card @ Best Buy" data-dimension48="Galaxy Watch 9: up to $250 off w/ trade-in + $50 gift card @ Best Buy" data-dimension25=""><strong>up to $250 off w/ trade-in + $50 gift card @ Best Buy</strong></a><br>Best Buy is offering up to $250 off the Galaxy Watch 9 with trade-in. Additionally, Best Buy Plus or Total members will receive a $50 gift card. (Membership <a href="https://www.bestbuy.com/site/electronics/best-buy-membership/pcmcat1679668833285.c?id=pcmcat1679668833285" target="_blank" rel="nofollow">plans start at $29/year at Best Buy</a>).<a class="view-deal button" href="https://www.bestbuy.com/site/promo/samsung-galaxy-watch-offer" target="_blank" rel="nofollow" data-dimension112="87d52ad0-860b-11f1-9a8a-bf7294b52e2e" data-action="Deal Block" data-label="Galaxy Watch 9: up to $250 off w/ trade-in + $50 gift card @ Best Buy" data-dimension48="Galaxy Watch 9: up to $250 off w/ trade-in + $50 gift card @ Best Buy" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="87d52b7a-860b-11f1-a8a7-7b4cf3fb48c4" data-action="Deal Block" data-label="Galaxy Watch 9: for $379 @ Amazon" data-dimension48="Galaxy Watch 9: for $379 @ Amazon" href="https://www.amazon.com/dp/B0H9BPZXZC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1257px;"><p class="vanilla-image-block" style="padding-top:83.77%;"><img id="W36tqDZ4ZJVpeUcjbxsu4C" name="Galaxy Watch 9 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/W36tqDZ4ZJVpeUcjbxsu4C.jpg" mos="" align="middle" fullscreen="" width="1257" height="1053" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Watch 9: </strong><a href="https://www.amazon.com/dp/B0H9BPZXZC" target="_blank" rel="nofollow" data-dimension112="87d52b7a-860b-11f1-a8a7-7b4cf3fb48c4" data-action="Deal Block" data-label="Galaxy Watch 9: for $379 @ Amazon" data-dimension48="Galaxy Watch 9: for $379 @ Amazon" data-dimension25=""><strong>for $379 @ Amazon</strong></a><br>Amazon is offering a free $50 Amazon gift card when you buy your Galaxy Watch 9 at Amazon. <a class="view-deal button" href="https://www.amazon.com/dp/B0H9BPZXZC" target="_blank" rel="nofollow" data-dimension112="87d52b7a-860b-11f1-a8a7-7b4cf3fb48c4" data-action="Deal Block" data-label="Galaxy Watch 9: for $379 @ Amazon" data-dimension48="Galaxy Watch 9: for $379 @ Amazon" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung turned the Galaxy Watch Ultra 2 into a fully-fledged dive computer — but there’s a catch ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/samsung-turned-the-galaxy-watch-ultra-2-into-a-fully-fledged-dive-computer-but-theres-a-catch</link>
                                                                            <description>
                            <![CDATA[ The Ultra 2 has legit dive-ready specs and features, including the ability to monitor nitrogen levels, depth, temperature, and dive time. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">9aCe3HVrodUa26zrhEnNnM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/u4HGWUFwc8QuKbaWkCz6NZ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 18:10:53 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/u4HGWUFwc8QuKbaWkCz6NZ-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background]]></media:description>                                                            <media:text><![CDATA[Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of a water-soaked Samsung Galaxy Watch Ultra 2 on a bright blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/u4HGWUFwc8QuKbaWkCz6NZ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung just dropped the new <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a>, a larger-than-life, tough-built smartwatch with an ultra-bright display, plenty of battery life, health and fitness tech galore, and legit dive-ready features. </p><p>Unlike the original <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Galaxy Watch Ultra</a>, which isn’t meant for diving or high-impact water sports despite its 100-meter water resistance rating, the new model is not only rated for 100 meters but is also EN13319-certified for scuba diving, not to mention IP69K-certified against dust and moisture.</p><p>That’s not all; Samsung has partnered with <a href="https://www.mares.com/en_US/mares-app" target="_blank" rel="nofollow">Mares</a>, a popular and trusted dive app, to turn the Galaxy Watch Ultra 2 into a fully-fledged dive computer to track your dives. It also provides real-time nitrogen level monitoring, depth and water temperature, dive time, and more. However, there is a catch.</p><h2 id="the-samsung-galaxy-watch-ultra-2-is-built-for-diving-for-a-price">The Samsung Galaxy Watch Ultra 2 is built for diving... for a price</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4737px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="7RLoxSzFXxAzKQFchr6Qod" name="GalaxyWatchUltra2-v-AWU3-01" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/7RLoxSzFXxAzKQFchr6Qod.jpg" mos="" align="middle" fullscreen="" width="4737" height="2664" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>To access all of these cool dive-ready features, Galaxy Watch Ultra 2 users will need to subscribe to the Mares app, which is $8.99 a month or $69.99 for the year. For the early birds, it's worth mentioning that support for Mares won't be available right when the smartwatch ships, but a little later this year. </p><p>Samsung has a two-year deal with Mares that makes the app exclusive to only the Galaxy Watch Ultra 2 and no other Android smartwatches. Of course, Apple already has a partnership in place with Mares, which similarly turns the <a href="https://www.tomsguide.com/reviews/apple-watch-ultra-review">Apple Watch Ultra</a>, <a href="https://www.tomsguide.com/reviews/apple-watch-ultra-2">Apple Watch Ultra 2</a>, and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3</a> into wrist-based dive computers.</p><p>One other important note: The Galaxy Watch Ultra 2 is meant for recreational dives only, specifically, those less than 40 meters in depth. Sorry, no deep-sea diving. </p><p>What are your thoughts on the Samsung Galaxy Watch Ultra 2 and its water-based features? Would you trust it on your next dive? More importantly, are you willing to pony up the extra cash for the Mares app? Let me know in the comments below. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OoD23X"></div>                            </div>                            <script src="https://kwizly.com/embed/OoD23X.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/smartwatch-water-resistance-ratings-explained">Smartwatch water resistance ratings explained</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">5 things to know about the new Samsung Galaxy Watch 9</a></li><li><a href="https://www.tomsguide.com/wellness/smart-rings/the-samsung-galaxy-ring-is-about-to-be-the-worlds-first-fda-cleared-smart-ring-for-sleep-apnea">The Samsung Galaxy Ring is about to be the world’s first FDA-cleared smart ring for sleep apnea</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 9 amazing Garmin smartwatch deals that'll make you forget about the Garmin Cirqa ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/7-amazing-garmin-smartwatch-deals-thatll-make-you-forget-about-the-garmin-cirqa</link>
                                                                            <description>
                            <![CDATA[ Garmin is slashing prices on smartwatches and fitness trackers! Check out the best savings on a range of models. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">29aGseF3ceCrkQGUMQGJ5K</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6Whob4Gd7E7dUP4x73YyE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 14:19:56 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 18:25:13 +0000</updated>
                                                                                                                                            <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ millie.daviswilliams@futurenet.com (Millie Davis-Williams) ]]></author>                    <dc:creator><![CDATA[ Millie Davis-Williams ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/WU6pa7hKuxs5ScCoqcXYWA.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Millie is a Deals Editor at Tom&#039;s Guide specializing in tech deals content. Based in London, Millie has spent a lifetime stubbornly refusing to pay full price on any possible purchase. She has years of searching for the best discounts on the latest and greatest phones, TVs and gadgets under her belt, and knows how to sort the best deals from the rest. Helping readers save on the products they want is her mission, whether it’s an Apple Watch or a new tablet.&lt;/p&gt;&lt;p&gt;Since working at Tom’s Guide, Millie has covered retail events like Prime Day, Black Friday and Cyber Monday extensively, meaning she knows the products readers are looking for and the best times of year to hit “purchase.”&lt;/p&gt;&lt;p&gt;When she’s not looking for discounts, Millie covers news and writes how-to articles about everything from phones, streaming devices, and headphones to apps and video games.&lt;/p&gt;&lt;p&gt;In her spare time, Millie enjoys reading, gaming on her Nintendo Switch and creating digital art. She’s also a fan of watching Disney movies and collecting plush (the latter having totally taken over her bedroom.)&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6Whob4Gd7E7dUP4x73YyE-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin Forerunner 55 smartwatch on wrist]]></media:description>                                                            <media:text><![CDATA[Garmin Forerunner 55 smartwatch on wrist]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin Forerunner 55 smartwatch on wrist]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6Whob4Gd7E7dUP4x73YyE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In case you haven't heard, the <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor">Garmin Cirqa</a> is on the way. It's a screenless fitness tracker, and Garmin's version of the Whoop 5.0 and Fitbit Air.</p><p>But if you're not into the whole screenless approach, there are tons of Garmin smartwatch deals to get excited about. <a href="https://www.amazon.com/stores/Garmin/page/675B188D-FBE3-4FF4-9DD0-E48E4A2C888D" target="_blank" rel="nofollow">Amazon is taking up to 50% off Garmin</a>, and the sale includes some of the brand's most popular models. For example, you can currently grab the budget-friendly <a href="https://www.amazon.com/Garmin-Forerunner-Running-Suggested-Workouts/dp/B092RCLKHN" target="_blank" rel="nofollow">Garmin Forerunner 55 on sale for its lowest price ever at $129</a>.</p><p>Keep scrolling to see all my favorite Garmin deals. I also recommend checking out our <a href="https://www.tomsguide.com/coupons/amazon.com">Amazon promo codes</a> coverage.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong></strong><a href="https://www.amazon.com/stores/page/FF0DE967-3578-4FF5-9BB4-07591E715EEE" target="_blank" rel="nofollow"><strong>shop all Garmin deals at Amazon</strong></a></li><li><strong>Garmin Forerunner 55: </strong><a href="https://www.amazon.com/dp/B092RCLKHN" target="_blank" rel="nofollow"><strong>was $199 now $129</strong></a></li><li><strong>Garmin Vivoactive 5: </strong><a href="https://www.amazon.com/dp/B0CG6NBJ61" target="_blank" rel="nofollow"><strong>was $299 now $189</strong></a></li><li><strong>Garmin Bounce 2: </strong><a href="https://www.amazon.com/Garmin-BounceTM-Smartwatch-Messaging-Location/dp/B0FRG6MXMM" target="_blank" rel="nofollow"><strong>was $299 now $249</strong></a></li><li><strong>Garmin Approach J1: </strong><a href="https://www.amazon.com/Garmin-Approach%C2%AE-Colorful-Essential-Improving/dp/B0GHSSFXC7" target="_blank" rel="nofollow"><strong>was $299 now $249</strong></a></li><li><strong>Garmin Instinct Crossover Solar: </strong><a href="https://www.amazon.com/Garmin-Instinct-Crossover-Smartwatch-Capabilities/dp/B0BHTV7MCG" target="_blank" rel="nofollow"><strong>was $449 now $279</strong></a></li><li><strong>Garmin Venu 3S: </strong><a href="https://www.amazon.com/Garmin-Stainless-1-2-Inch-Touchscreen-Silicone/dp/B0CDC6Y617" target="_blank" rel="nofollow"><strong>was $449 now $344</strong></a></li><li><strong>Garmin Epix Pro: </strong><a href="https://www.amazon.com/Garmin-Performance-Smartwatch-Technology-Flashlight/dp/B0BYFCZZ9F/" target="_blank" rel="nofollow"><strong>was $1,099 now $549</strong></a></li></ul><h3 class="article-body__section" id="section-best-garmin-deals"><span>Best Garmin Deals</span></h3><div class="product"><a data-dimension112="5fd68b44-85d6-11f1-9ecb-c7a20427fcdd" data-action="Deal Block" data-label="Garmin Forerunner 55 review" data-dimension48="Garmin Forerunner 55 review" data-dimension25="$129" href="https://www.amazon.com/dp/B092RCLKHN" 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:98.82%;"><img id="hMqJHMsdaMpcXAFkz2Nywe" name="Garminf forerunner" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hMqJHMsdaMpcXAFkz2Nywe.jpg" mos="" align="middle" fullscreen="" width="679" height="671" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is the Garmin to get if you're buying a running watch for the first time. It offers a bright screen, easy to read stats, and long battery life. You'll also have access to PacePro suggested workouts, which is like having a running coach on your wrist. In our <a href="https://www.tomsguide.com/reviews/garmin-forerunner-55" data-dimension112="5fd68b44-85d6-11f1-9ecb-c7a20427fcdd" data-action="Deal Block" data-label="Garmin Forerunner 55 review" data-dimension48="Garmin Forerunner 55 review" data-dimension25="$129">Garmin Forerunner 55 review</a>, we said this watch was like having an expert coach on your wrist.<a class="view-deal button" href="https://www.amazon.com/dp/B092RCLKHN" target="_blank" rel="nofollow" data-dimension112="5fd68b44-85d6-11f1-9ecb-c7a20427fcdd" data-action="Deal Block" data-label="Garmin Forerunner 55 review" data-dimension48="Garmin Forerunner 55 review" data-dimension25="$129">View Deal</a></p></div><div class="product"><a data-dimension112="5fd68ba8-85d6-11f1-99a3-175250259be0" data-action="Deal Block" data-label="Garmin Vivoactive 5 review" data-dimension48="Garmin Vivoactive 5 review" data-dimension25="$189" href="https://www.amazon.com/dp/B0CG6NBJ61" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1004px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="VkZemqZBaA53K6cSfpqqgX" name="51zyaVCe-5L._AC_SL1000_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/VkZemqZBaA53K6cSfpqqgX.jpg" mos="" align="middle" fullscreen="" width="1004" height="1004" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Garmin Vivoactive 5 is a comprehensive fitness tracker that comes in at an affordable price. In our <a href="https://www.tomsguide.com/reviews/garmin-vivoactive-5-review-is-it-ready-to-take-on-the-apple-watch" data-dimension112="5fd68ba8-85d6-11f1-99a3-175250259be0" data-action="Deal Block" data-label="Garmin Vivoactive 5 review" data-dimension48="Garmin Vivoactive 5 review" data-dimension25="$189">Garmin Vivoactive 5 review</a>, we loved this device's gorgeous AMOLED display, access to multitude of sports apps and its advanced health stats like sleep and stress coaching.<a class="view-deal button" href="https://www.amazon.com/dp/B0CG6NBJ61" target="_blank" rel="nofollow" data-dimension112="5fd68ba8-85d6-11f1-99a3-175250259be0" data-action="Deal Block" data-label="Garmin Vivoactive 5 review" data-dimension48="Garmin Vivoactive 5 review" data-dimension25="$189">View Deal</a></p></div><div class="product"><a data-dimension112="02b25b38-878d-11f1-8abb-2fcc2e27684e" data-action="Deal Block" data-label="pricier Forerunner 170 Music ($349)" data-dimension48="pricier Forerunner 170 Music ($349)" data-dimension25="$225" href="https://www.amazon.com/dp/B0CT3SGHXL" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:128.78%;"><img id="5kFqr4NPwzjapMdRURmKzG" name="Forerunner 165" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5kFqr4NPwzjapMdRURmKzG.png" mos="" align="middle" fullscreen="" width="900" height="1159" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Forerunner 165 is the perfect affordable option for runners and considerably cheaper than the newer Garmin Forerunner 170 thanks to this deal, which is on the standard model of the watch. It's a lightweight, attractive watch with an AMOLED display that offers equally accurate GPS and heart rate tracking. It also has support for NFC payments, but keep note that it lacks the music storage available on the <a href="https://www.amazon.com/Garmin-Forerunner%C2%AE-Smartwatch-Advanced-Training/dp/B0H1F79N52" target="_blank" rel="nofollow" data-dimension112="02b25b38-878d-11f1-8abb-2fcc2e27684e" data-action="Deal Block" data-label="pricier Forerunner 170 Music ($349)" data-dimension48="pricier Forerunner 170 Music ($349)" data-dimension25="$225">pricier Forerunner 170 Music ($349)</a>.<a class="view-deal button" href="https://www.amazon.com/dp/B0CT3SGHXL" target="_blank" rel="nofollow" data-dimension112="02b25b38-878d-11f1-8abb-2fcc2e27684e" data-action="Deal Block" data-label="pricier Forerunner 170 Music ($349)" data-dimension48="pricier Forerunner 170 Music ($349)" data-dimension25="$225">View Deal</a></p></div><div class="product"><a data-dimension112="5fd68c0c-85d6-11f1-8f11-dd5358c01a63" data-action="Deal Block" data-label="If you want your kids to stay connected, but don't want to get them a smartphone — the Garmin Bounce 2 is perfect. It's equipped with LTE support and offers real-time location tracking, two-way calling and voice messages. It'll also keep track of your kids activity, whether they're running, biking or swimming." data-dimension48="If you want your kids to stay connected, but don't want to get them a smartphone — the Garmin Bounce 2 is perfect. It's equipped with LTE support and offers real-time location tracking, two-way calling and voice messages. It'll also keep track of your kids activity, whether they're running, biking or swimming." data-dimension25="$249" href="https://www.amazon.com/Garmin-BounceTM-Smartwatch-Messaging-Location/dp/B0FRG6MXMM" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1201px;"><p class="vanilla-image-block" style="padding-top:118.65%;"><img id="FrygsjZiMXW4BGEfXuR8eD" name="Bounce 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FrygsjZiMXW4BGEfXuR8eD.jpg" mos="" align="middle" fullscreen="" width="1201" height="1425" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want your kids to stay connected, but don't want to get them a smartphone — the Garmin Bounce 2 is perfect. It's equipped with LTE support and offers real-time location tracking, two-way calling and voice messages. It'll also keep track of your kids activity, whether they're running, biking or swimming.<a class="view-deal button" href="https://www.amazon.com/Garmin-BounceTM-Smartwatch-Messaging-Location/dp/B0FRG6MXMM" target="_blank" rel="nofollow" data-dimension112="5fd68c0c-85d6-11f1-8f11-dd5358c01a63" data-action="Deal Block" data-label="If you want your kids to stay connected, but don't want to get them a smartphone — the Garmin Bounce 2 is perfect. It's equipped with LTE support and offers real-time location tracking, two-way calling and voice messages. It'll also keep track of your kids activity, whether they're running, biking or swimming." data-dimension48="If you want your kids to stay connected, but don't want to get them a smartphone — the Garmin Bounce 2 is perfect. It's equipped with LTE support and offers real-time location tracking, two-way calling and voice messages. It'll also keep track of your kids activity, whether they're running, biking or swimming." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="5fd68c70-85d6-11f1-9075-b580841ee3fa" data-action="Deal Block" data-label="Garmin's junior golf watch is on sale for its lowest price ever. For young golfers, it provides a 1.2-inch AMOLED touch display, 43,000 preloaded courses, up to 15 hours of battery life in GPS mode and guidance on how to improve their game." data-dimension48="Garmin's junior golf watch is on sale for its lowest price ever. For young golfers, it provides a 1.2-inch AMOLED touch display, 43,000 preloaded courses, up to 15 hours of battery life in GPS mode and guidance on how to improve their game." data-dimension25="$249" href="https://www.amazon.com/Garmin-Approach%C2%AE-Colorful-Essential-Improving/dp/B0GHSSFXC7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1188px;"><p class="vanilla-image-block" style="padding-top:109.60%;"><img id="tNXk8aujtBQFDqmcMMYUGD" name="Approach J1" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tNXk8aujtBQFDqmcMMYUGD.jpg" mos="" align="middle" fullscreen="" width="1188" height="1302" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Garmin's junior golf watch is on sale for its lowest price ever. For young golfers, it provides a 1.2-inch AMOLED touch display, 43,000 preloaded courses, up to 15 hours of battery life in GPS mode and guidance on how to improve their game.<a class="view-deal button" href="https://www.amazon.com/Garmin-Approach%C2%AE-Colorful-Essential-Improving/dp/B0GHSSFXC7" target="_blank" rel="nofollow" data-dimension112="5fd68c70-85d6-11f1-9075-b580841ee3fa" data-action="Deal Block" data-label="Garmin's junior golf watch is on sale for its lowest price ever. For young golfers, it provides a 1.2-inch AMOLED touch display, 43,000 preloaded courses, up to 15 hours of battery life in GPS mode and guidance on how to improve their game." data-dimension48="Garmin's junior golf watch is on sale for its lowest price ever. For young golfers, it provides a 1.2-inch AMOLED touch display, 43,000 preloaded courses, up to 15 hours of battery life in GPS mode and guidance on how to improve their game." data-dimension25="$249">View Deal</a></p></div><div class="product"><a data-dimension112="5fd68cd4-85d6-11f1-a401-6de34060f745" data-action="Deal Block" data-label="The Garmin Instinct Crossover is a hybrid between a traditional watch and a smartwatch, with mechanical timekeeping and a digital display. You'll get access to smart features like GPS and NFC for payments, as well as incredible 70 day battery life thanks to the solar panel." data-dimension48="The Garmin Instinct Crossover is a hybrid between a traditional watch and a smartwatch, with mechanical timekeeping and a digital display. You'll get access to smart features like GPS and NFC for payments, as well as incredible 70 day battery life thanks to the solar panel." data-dimension25="$279" href="https://www.amazon.com/Garmin-Instinct-Crossover-Smartwatch-Capabilities/dp/B0BHTV7MCG" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1226px;"><p class="vanilla-image-block" style="padding-top:122.35%;"><img id="TVqyZieEjXyFkdy9iivkcB" name="Instinct Crossover Solar" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/TVqyZieEjXyFkdy9iivkcB.jpg" mos="" align="middle" fullscreen="" width="1226" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Garmin Instinct Crossover is a hybrid between a traditional watch and a smartwatch, with mechanical timekeeping and a digital display. You'll get access to smart features like GPS and NFC for payments, as well as incredible 70 day battery life thanks to the solar panel.<a class="view-deal button" href="https://www.amazon.com/Garmin-Instinct-Crossover-Smartwatch-Capabilities/dp/B0BHTV7MCG" target="_blank" rel="nofollow" data-dimension112="5fd68cd4-85d6-11f1-a401-6de34060f745" data-action="Deal Block" data-label="The Garmin Instinct Crossover is a hybrid between a traditional watch and a smartwatch, with mechanical timekeeping and a digital display. You'll get access to smart features like GPS and NFC for payments, as well as incredible 70 day battery life thanks to the solar panel." data-dimension48="The Garmin Instinct Crossover is a hybrid between a traditional watch and a smartwatch, with mechanical timekeeping and a digital display. You'll get access to smart features like GPS and NFC for payments, as well as incredible 70 day battery life thanks to the solar panel." data-dimension25="$279">View Deal</a></p></div><div class="product"><a data-dimension112="5fd68d88-85d6-11f1-8b92-a1506fa40d68" data-action="Deal Block" data-label="Garmin Venu 3" data-dimension48="Garmin Venu 3" data-dimension25="$344" href="https://www.amazon.com/Garmin-Stainless-1-2-Inch-Touchscreen-Silicone/dp/B0CDC6Y617" 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="Un7k8oR8kzi2SZoU3heUR4" name="Garmin Venu 3S" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Un7k8oR8kzi2SZoU3heUR4.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Garmin Venu 3S shares many of our favorite features of the <a href="https://www.tomsguide.com/reviews/garmin-venu-3" data-dimension112="5fd68d88-85d6-11f1-8b92-a1506fa40d68" data-action="Deal Block" data-label="Garmin Venu 3" data-dimension48="Garmin Venu 3" data-dimension25="$344">Garmin Venu 3</a>, just in a smaller package. It has a 41mm OLED touch display, excellent fitness tracking features and its battery life lasts up to 10 days.<a class="view-deal button" href="https://www.amazon.com/Garmin-Stainless-1-2-Inch-Touchscreen-Silicone/dp/B0CDC6Y617" target="_blank" rel="nofollow" data-dimension112="5fd68d88-85d6-11f1-8b92-a1506fa40d68" data-action="Deal Block" data-label="Garmin Venu 3" data-dimension48="Garmin Venu 3" data-dimension25="$344">View Deal</a></p></div><div class="product"><a data-dimension112="02b25c00-878d-11f1-b6d5-cb8f24c0cbd5" data-action="Deal Block" data-label="Garmin Instinct 3 review" data-dimension48="Garmin Instinct 3 review" data-dimension25="$349" href="https://www.amazon.com/Garmin-Instinct%C2%AE-Smartwatch-Metal-Reinforced-Flashlight/dp/B0DSC8JF59" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1200px;"><p class="vanilla-image-block" style="padding-top:133.33%;"><img id="ZNKUwTZvmqavGT5ruudSjj" name="Instinct3-BG" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZNKUwTZvmqavGT5ruudSjj.jpg" mos="" align="middle" fullscreen="" width="1200" height="1600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Garmin Instinct 3 is a sporty, rugged, long-lasting smartwatch designed for outdoor adventurers. Solid GPS performance, reliable heart rate/sleep tracking, and a nifty built-in LED flashlight all add to its appeal. In our <a href="https://www.tomsguide.com/Garmin-Instinct-3-review" data-dimension112="02b25c00-878d-11f1-b6d5-cb8f24c0cbd5" data-action="Deal Block" data-label="Garmin Instinct 3 review" data-dimension48="Garmin Instinct 3 review" data-dimension25="$349">Garmin Instinct 3 review</a>, we called it a near-perfect smartwatch for outdoor enthusiasts.<a class="view-deal button" href="https://www.amazon.com/Garmin-Instinct%C2%AE-Smartwatch-Metal-Reinforced-Flashlight/dp/B0DSC8JF59" target="_blank" rel="nofollow" data-dimension112="02b25c00-878d-11f1-b6d5-cb8f24c0cbd5" data-action="Deal Block" data-label="Garmin Instinct 3 review" data-dimension48="Garmin Instinct 3 review" data-dimension25="$349">View Deal</a></p></div><div class="product"><a data-dimension112="5fd68df6-85d6-11f1-9a41-953595f3acc7" data-action="Deal Block" data-label="This deal is on the 51mm Garmin Epix Pro Gen 2, the largest model in the Epix lineup. It also has the longest battery life. It's considerably cheaper than the newer Fenix 8, and having tested both, our Fitness Editor says the Epix Pro has all the same key sports tracking and training analysis features you really need, so this deal is worth considering." data-dimension48="This deal is on the 51mm Garmin Epix Pro Gen 2, the largest model in the Epix lineup. It also has the longest battery life. It's considerably cheaper than the newer Fenix 8, and having tested both, our Fitness Editor says the Epix Pro has all the same key sports tracking and training analysis features you really need, so this deal is worth considering." data-dimension25="$549" href="https://www.amazon.com/Garmin-Performance-Smartwatch-Technology-Flashlight/dp/B0BYFCZZ9F/" 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="qR6ajzg9uXied8yzHk82kM" name="Garmin Epix Pro (Gen 2) GPS Smartwatch" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qR6ajzg9uXied8yzHk82kM.jpg" mos="" align="middle" fullscreen="" width="1080" height="1080" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal is on the 51mm Garmin Epix Pro Gen 2, the largest model in the Epix lineup. It also has the longest battery life. It's considerably cheaper than the newer Fenix 8, and having tested both, our Fitness Editor says the Epix Pro has all the same key sports tracking and training analysis features you really need, so this deal is worth considering.<a class="view-deal button" href="https://www.amazon.com/Garmin-Performance-Smartwatch-Technology-Flashlight/dp/B0BYFCZZ9F/" target="_blank" rel="nofollow" data-dimension112="5fd68df6-85d6-11f1-9a41-953595f3acc7" data-action="Deal Block" data-label="This deal is on the 51mm Garmin Epix Pro Gen 2, the largest model in the Epix lineup. It also has the longest battery life. It's considerably cheaper than the newer Fenix 8, and having tested both, our Fitness Editor says the Epix Pro has all the same key sports tracking and training analysis features you really need, so this deal is worth considering." data-dimension48="This deal is on the 51mm Garmin Epix Pro Gen 2, the largest model in the Epix lineup. It also has the longest battery life. It's considerably cheaper than the newer Fenix 8, and having tested both, our Fitness Editor says the Epix Pro has all the same key sports tracking and training analysis features you really need, so this deal is worth considering." data-dimension25="$549">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 5 things to know about the new Samsung Galaxy Watch 9 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Watch 9 looks exactly like the Galaxy Watch 8, but don't let that fool you. Samsung went ahead and doubled down on fitness and holistic features in the new model. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">io8uy2JyxrFMHGQdZSnjXe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/e2tBcV5r7FAg2X2NPSNyYj-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 13:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 22 Jul 2026 14:00:41 +0000</updated>
                                                                                                                                            <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/e2tBcV5r7FAg2X2NPSNyYj-1280-80.jpg">
                                                            <media:credit><![CDATA[Samsung]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Watch 9 close-up]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Watch 9 close-up]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Watch 9 close-up]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/e2tBcV5r7FAg2X2NPSNyYj-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Samsung Galaxy Watch 9 just got unveiled during the brand's annual summer <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">Galaxy Unpacked</a> event alongside the <a href="https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review">Galaxy Watch Ultra 2</a>, Galaxy Z Fold 9, and Galaxy Z Flip 8 handsets. </p><p>A fairly iterative update compared to the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Galaxy Watch 8</a>, the biggest improvements the new model brings to the table are (potentially) improved battery life and a fairly impressive list of new fitness and holistic tracking tools, which may or may not ultimately make it to older models via future firmware.</p><p>Here are the five biggest things you need to know about the new Samsung Galaxy Watch 9.</p><h3 class="article-body__section" id="section-galaxy-watch-9-cheat-sheet"><span>Galaxy Watch 9 cheat sheet</span></h3><ul><li><strong>Price: </strong>$379 for 40mm (no LTE) or $409 for 44mm (no LTE); add $50 to either for cellular</li><li><strong>Design: </strong>Same design and size options as Galaxy Watch 8; 40mm is available in Cream or Graphite; 44mm comes in Graphite or Silver</li><li><strong>'Classic' model</strong>: Samsung did not announce a Galaxy Watch 9 Classic with a clicky bezel</li><li><strong>Screen: </strong>Same max brightness, 3,000 nits, as Galaxy Watch 8</li><li><strong>Health features:</strong> New 'Vitals' dashboard with key metrics including heart rate, HRV, Sp02, body temp, breath rate in one place; new 'Heart Health' score</li><li><strong>Fitness features:</strong> New 'Cardio Load' insights, new 'Fitness Index' score out of 100 and based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time</li><li><strong>Battery life:</strong> 40mm Galaxy Watch 9 has a 390 mAh battery compared to a 325 mAh battery for the 40mm Galaxy Watch 8; 44mm Galaxy Watch 9 sports a 445 mAh battery compared to a 435 mAh battery for the 44mm Galaxy Watch 8</li></ul><h3 class="article-body__section" id="section-galaxy-watch-9-versus-the-competition"><span>Galaxy Watch 9: Versus the competition</span></h3><div ><table><caption>Samsung Galaxy Watch 9 specs</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Watch 9</p></th><th  ><p>Samsung Galaxy Watch 8</p></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$379</p></td><td  ><p>$349</p></td><td  ><p>$699 / AU$1299</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions </strong></p></td><td  ><p>42.7 x 40.4 x 8.6mm /<br>46.0 x 43.7 x 8.6 mm</p></td><td  ><p>42.7 x 40.4 x 8.6mm /<br>46.0 x 43.7 x 8.6 mm</p></td><td  ><p>47 x 47 x 10 mm </p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>31.5 g / 34 g</p></td><td  ><p>30 g / 34 g</p></td><td  ><p>61.5 g</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>1.34-inch / 1.47-inch; 3,000 nits max brightness</p></td><td  ><p>1.34-inch / 1.47-inch; 3,000 nits max brightness</p></td><td  ><p>1.52-inch AMOLED, 5,000 nits max brightness </p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance </strong></p></td><td  ><p>50 meters</p></td><td  ><p>50 meters</p></td><td  ><p>100 meters</p></td></tr><tr><td class="firstcol " ><p><strong>Battery capacity</strong></p></td><td  ><p>40mm: 390mAh / 44mm: 445mAh</p></td><td  ><p>40mm: 325mAh / 44mm: 435mAh</p></td><td  ><p>800 mAh</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-1-samsung-increased-the-price-across-the-line"><span>1. Samsung increased the price across the line</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:1730px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="ZK5uzLv2zazQWDZtZ6uiB7" name="GalaxyWatch9" alt="Samsung Galaxy Watch 9 in five colors" src="https://cdn.mos.cms.futurecdn.net/ZK5uzLv2zazQWDZtZ6uiB7.jpg" mos="" align="middle" fullscreen="" width="1730" height="973" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>When Samsung announced the Galaxy Watch 8 this time last year, I wasn't surprised to see a $50 price increase across the board compared to the Galaxy Watch 7. However, I was surprised to see Samsung raise the price of the Watch 9 this time around.</p><p>The 40mm Galaxy Watch 9, for example, <a href="https://www.samsung.com/us/watches/galaxy-watch9/buy/galaxy-watch9-40mm-graphite-bluetooth-sku-sm-l340nzkaxaa/" target="_blank" rel="nofollow">starts at $379</a> without LTE, compared to $349 for the Galaxy Watch 8 equivalent. The 44mm Galaxy Watch 9, meanwhile, is $409 versus $379 for last year's equivalent. </p><p>Preorders are now available for the Galaxy Watch 9, which should ship later this month.</p><ul><li><strong>Galaxy Watch 9 (Bluetooth, 40mm): $379</strong></li><li><strong>Galaxy Watch 9 (LTE, 40mm): $429</strong></li><li><strong>Galaxy Watch 9 (Bluetooth, 44mm): $409</strong></li><li><strong>Galaxy Watch 9 (LTE, 44mm): $459</strong></li></ul><h3 class="article-body__section" id="section-2-there-s-no-galaxy-watch-9-classic"><span>2. There's no Galaxy Watch 9 'Classic'</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="JN2bbBaBoTPrpbhNd9WPLj" name="GalaxyWatch8-rev-19" alt="Close-up of the Samsung Galaxy Watch Classic on a user's wrist with the Gemini AI app open" src="https://cdn.mos.cms.futurecdn.net/JN2bbBaBoTPrpbhNd9WPLj.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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>I was a big fan of the Samsung Galaxy Watch 8 Classic (see image above), which sports a bidirectional clicky bezel for navigation and an additional customizable button compared to the standard Galaxy Watch 8 models.</p><p>Unfortunately, there is no Samsung Galaxy Watch 9 Classic. That said, Samsung has confirmed that the Galaxy Watch 8 Classic will remain in the brand's lineup for the time being. </p><h3 class="article-body__section" id="section-3-the-external-design-is-the-same-as-galaxy-watch-8"><span>3. The external design is the same as Galaxy Watch 8</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:1472px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="y2a5Ad2gs74hArEeHsBvXj" name="GalaxyWatch9-02" alt="Samsung Galaxy Watch 9 close-up" src="https://cdn.mos.cms.futurecdn.net/y2a5Ad2gs74hArEeHsBvXj.jpg" mos="" align="middle" fullscreen="" width="1472" height="828" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>While Samsung made all sorts of under-the-hood upgrades to the Galaxy Watch 9, including a new processor and increased battery capacity, the outward appearance remains unchanged from its predecessor.</p><p>The physical dimensions and the weight are also essentially the same, as is the 50-meter water resistance rating. Finally, the Galaxy Watch 9 also boasts the same 3,000-nit max brightness display and twin-button design as the Galaxy Watch 8.</p><h3 class="article-body__section" id="section-4-there-are-lots-of-new-holistic-features"><span>4. There are lots of new holistic 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:1744px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UQrvbF3bXyxMhpqm2FifZj" name="GalaxyWatch9-03" alt="Samsung Galaxy Watch 9 close-up" src="https://cdn.mos.cms.futurecdn.net/UQrvbF3bXyxMhpqm2FifZj.jpg" mos="" align="middle" fullscreen="" width="1744" height="981" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Samsung's latest generation of wearables is all about preventative rather than reactive holistic insights. As a result, the Galaxy Watch 9 — and the new Galaxy Watch Ultra 2 — both feature a whole host of new wellness scores, dashboards, and insights. </p><p>The list includes a new Vitals dashboard, Heart Health Score, Daily Cardio Load metric, and Fitness Index score.</p><p>The Vitals dashboard brings your most important wellness metrics into one easy-to-view panel with your current heart rate, heart rate variability (HRV), blood oxygen saturation percentage (Sp02), body temperature, and breath rate.</p><p>The new Heart Health score, meanwhile, is based on four metrics including your seven-day physical activity average, sleep time average, Body Mass Index (BMI), and estimated blood pressure. </p><p>For runners and high-cardio athletes, the new Cardio Load metric is designed to help you train more effectively, with built-in recovery suggestions to help avoid injury. </p><p>Finally, the new Fitness Index is a personalized score based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time. </p><p>The output is five individual Fitness Index scores: Body Composition, Cardio, Endurance, Strength, and Flexibility, ranging from one to 100. These scores are calculated by comparing your fitness levels to other users in your age range. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1718px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="3hT4beoeEUTdeqFEQf8P9J" name="GalaxyWatch9-04" alt="Samsung Galaxy Watch 9" src="https://cdn.mos.cms.futurecdn.net/3hT4beoeEUTdeqFEQf8P9J.jpg" mos="" align="middle" fullscreen="" width="1718" height="966" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><h3 class="article-body__section" id="section-5-battery-life-should-be-slightly-improved"><span>5. Battery life should be slightly improved </span></h3><p>Both the 40mm and 44mm Samsung Galaxy Watch 9 models see modest battery capacity increases. For the smaller model, that's a jump from 325 mAh for the Galaxy Watch 8 to 390 mAh for the Galaxy Watch 9. For the bigger model, the capacity has increased from 435 mAh on the Galaxy Watch 8 to 445 mAh for the Galaxy Watch 9.</p><p>Increased battery capacity, coupled with up to 15% more efficient processing, thanks to the new Snapdragon Wear Elite chipset, should mean that the Galaxy Watch 9 lasts longer than its predecessor, which averages about 30 hours per charge with the always-on display enabled.</p><p>Here's hoping that the Galaxy Watch 9 pushes that closer to 40 hours per charge or more to stay competitive with brands like Google; the 45mm Pixel Watch 4 lasts nearly 60 hours per charge in my testing.</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/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3">Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve been wearing the Samsung Galaxy Watch Ultra 2 for nearly a week — 5 things I like and 1 thing I don’t ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/galaxy-watch-ultra-2-hands-on-review</link>
                                                                            <description>
                            <![CDATA[ I've been testing the new Galaxy Watch Ultra 2 for just under a week, and here's what I like and don't. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">cuGhnYSB2EJJ9QWt8ZsNHC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/uiH5kxLWFFyNzASJsHfwuc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 13:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 22 Jul 2026 13:19:08 +0000</updated>
                                                                                                                                            <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/uiH5kxLWFFyNzASJsHfwuc-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:description>                                                            <media:text><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/uiH5kxLWFFyNzASJsHfwuc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been wearing the new Samsung Galaxy Watch Ultra 2 — just announced at <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">Galaxy Unpacked</a> alongside the <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">Samsung Galaxy Watch 9</a> —  for nearly a week, and I'm impressed. </p><p>Two years after the launch of the original ultra-rugged <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Samsung Galaxy Watch</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra</a> competitor, the updated version adds better battery life, tons of new health and fitness insights, a brighter screen, and improved water resistance, all in a familiar design.</p><p>As one of TG’s resident smartwatch nerds, after five days on the wrist, here are the five things I dig the most about the new Samsung Galaxy Watch Ultra 2, along with one thing that I don’t like.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-upgrade-cheat-sheet"><span>Galaxy Watch Ultra 2: Upgrade cheat sheet</span></h3><p>But first, here’s a cheat sheet to all the most notable Galaxy Watch Ultra 2 stats and upgrades. </p><ul><li><strong>Price: </strong>At $699, the Galaxy Watch Ultra 2 is $50 more than its predecessor, which launched two years ago, but still $100 less than its nearest competitor, the Apple Watch Ultra 3.</li><li><strong>Design:</strong> The Galaxy Watch Ultra 2 is a tiny bit thinner than the original Galaxy Watch Ultra, but you may not notice the difference; the dimensions and weight are identical to the original model</li><li><strong>Screen: </strong>Maximum screen brightness has been bumped up from 4,000 nits to 5,000 nits, making it remarkably visible in direct sunlight</li><li><strong>Health features:</strong> New 'Vitals' dashboard with key metrics including heart rate, HRV, Sp02, body temp, and breath rate in one place; new 'Heart Health' score</li><li><strong>Fitness features:</strong> New Cardio Load insights, new Fitness Index score out of 100 based on factors like daily step count average, V02 Max, average heart rate, BIA (Bioelectrical Impedance Analysis), and average workout recovery time</li><li><strong>Battery life:</strong> 800 mAh battery is the largest in an Android wearable and a 35% capacity increase over the original Galaxy Watch Ultra; battery life usage averages ~25% drain per day in testing so far</li></ul><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-versus-competition"><span>Galaxy Watch Ultra 2: Versus competition</span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Watch Ultra 2</p></th><th  ><p>Samsung Galaxy Watch Ultra </p></th><th  ><p>Apple Watch Ultra 3</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>$699 / AU$1299</p></td><td  ><p>$649</p></td><td  ><p>$799</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions </strong></p></td><td  ><p>47 x 47 x 10 mm </p></td><td  ><p>47 x 47 x 12 mm </p></td><td  ><p>49 x 44 x 12 mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>61.5 g</p></td><td  ><p>60.5 g</p></td><td  ><p>61 g</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>1.52-inch AMOLED, 5,000 nits max brightness </p></td><td  ><p>1.5-inch AMOLED, 3,000 nits max brightness </p></td><td  ><p>1.98-inch OLED, 3,000 nits max brightness</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance </strong></p></td><td  ><p>100 meters</p></td><td  ><p>100 meters (not approved for diving)</p></td><td  ><p>100 meters</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (tested)</strong></p></td><td  ><p>60 hours</p></td><td  ><p>48 hours </p></td><td  ><p>42 hours</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-like-1-the-price"><span>Galaxy Watch Ultra 2 like #1: The price </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:4737px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="7RLoxSzFXxAzKQFchr6Qod" name="GalaxyWatchUltra2-v-AWU3-01" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/7RLoxSzFXxAzKQFchr6Qod.jpg" mos="" align="middle" fullscreen="" width="4737" height="2664" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch Ultra 2 is priced at $699, a modest $50 increase over the launch price of its two-year-old predecessor. More notably, it's a hundred bucks cheaper than the latest Apple Watch Ultra 3, its nearest non-Android competitor. </p><p>Meanwhile, the latest <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">Galaxy Watch 9</a> models —which share pretty much all the same features, just in a less beefy package — range from $379 to $459.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-like-2-super-bright-display"><span>Galaxy Watch Ultra 2 like #2: Super-bright 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:4043px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="epc4o6iQmt6rjHFos7nLnd" name="GalaxyWatchUltra2-Gemini" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/epc4o6iQmt6rjHFos7nLnd.jpg" mos="" align="middle" fullscreen="" width="4043" height="2275" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The new Samsung Galaxy Watch Ultra 3 sports a sizable 1.52-inch display that maxes out at an impressive 5,000 nits, making it one of the brightest displays in any full-featured wearable, including 2026's <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a>.</p><p>The Apple Watch Ultra 3, by comparison, maxes out at 3,000 nits of max brightness. Real-world translation: the new Galaxy Watch Ultra 2 is a lot easier to read in bright sunlight than the newest Apple Watch Ultra.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-like-3-a-finally-dive-ready-design"><span>Galaxy Watch Ultra 2 like #3: A (finally) dive-ready 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:3515px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="LYfp9ZExt4wz8PuvGiRGJW" name="GalaxyWatchUltra2-03" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/LYfp9ZExt4wz8PuvGiRGJW.jpg" mos="" align="middle" fullscreen="" width="3515" height="1977" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The original Samsung Galaxy Watch Ultra promises 100 meters of water resistance, but unlike the newest Apple Watch Ultra 3, it's not rated for use while diving or even snorkeling.</p><p>Samsung no doubt caught some flak for this shortcoming. Thankfully, the new Galaxy Watch Ultra 2 is thoroughly dive-ready. In fact, Samsung is partnering with the <a href="https://www.mares.com/en_US/mares-app" target="_blank">Mares diving app</a> to turn the Galaxy Watch Ultra 2 into a fully-fledged dive computer, complete with speed monitoring and safety-stop alerts. </p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-like-4-new-holistic-features-galore"><span>Galaxy Watch Ultra 2 like #4: New holistic features galore </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:4797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="vHP2ZPZZ4Z6xQ2bKK5vYtZ" name="GalaxyWatchUltra2-06" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/vHP2ZPZZ4Z6xQ2bKK5vYtZ.jpg" mos="" align="middle" fullscreen="" width="4797" height="2698" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Similar to the new Samsung Galaxy Watch 9, the Galaxy Watch Ultra 2 ships fully-loaded with all sorts of new health and fitness insights. While some of these will possibly make their way to older models, for now, most are exclusive to the latest launches. </p><p>The features include a new Vitals dashboard for viewing your most important up-to-the-minute health stats in one place, a new Cardio Load score to see your heart health, a freshly launched Fitness Index score that compares your fitness to your peers, and more.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-like-5-big-on-battery-life"><span>Galaxy Watch Ultra 2 like #5: Big on battery life </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:4187px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bymkGs65ruZkWfvJQAJDCe" name="GalaxyWatchUltra2-02" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/bymkGs65ruZkWfvJQAJDCe.jpg" mos="" align="middle" fullscreen="" width="4187" height="2355" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Not only did Samsung equip the Galaxy Watch Ultra 2 with a higher-capacity battery — 590 mAh for the old model vs 800 mAh for the new one — but the Galaxy Watch Ultra 2 is noticeably more power-efficient than its predecessor, despite a brighter display.</p><p>In my testing so far, the Galaxy Watch Ultra 2 uses about 35% battery every 24 hours, including tracking a daily ~45-minute outdoor workout and a full night of sleep. </p><p>This leads me to believe that the Galaxy Watch Ultra 2 can last roughly three days or 72 hours per charge without using any power-saving features, a notable improvement over its predecessor, which lasted closer to 40 hours per charge.</p><h3 class="article-body__section" id="section-galaxy-watch-ultra-2-like-dislike-1-the-case-is-still-massive"><span>Galaxy Watch Ultra 2 like dislike #1: The case is still massive</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:3963px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6TYLqmeyBB7qGDFZaMMWob" name="GalaxyWatchUltra2-07" alt="Close-up look at the Samsung Galaxy Watch Ultra 2 smartwatch" src="https://cdn.mos.cms.futurecdn.net/6TYLqmeyBB7qGDFZaMMWob.jpg" mos="" align="middle" fullscreen="" width="3963" height="2229" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The original Samsung Galaxy Watch Ultra required nothing short of a burly wrist to look and feel "at home."  With dimensions as grand as 47.4 × 47.4 × 12.1 mm and a weight just over 60 g, the new Galaxy Watch Ultra 2 feels nearly as overwhelming on my normal-ish, 6.5-inch wrist as its predecessor.</p><p>Samsung made the new Galaxy Watch Ultra 2 a tiny bit thinner, shaving off over 2 mm of thickness. Still, the width and height remain the same. </p><p>That said, the new Galaxy Watch Ultra 2 strap is thinner, softer, and more flexible than its predecessor, which <em>is</em> a major improvement. </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/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3">Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Garmin Cirqa Smart Band launch: Garmin debuts a screen-free Whoop and Fitbit Air competitor ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-smart-band-launch-garmin-debuts-a-screen-free-whoop-and-fitbit-air-competitor</link>
                                                                            <description>
                            <![CDATA[ Garmin's long-rumored Cirqa fitness tracker has finally been announced, but can it really beat the Fitbit Air or Whoop 5.0? We intend to find out. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">g3vCvQXhmaxGHpzNRyaXkL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ehLfvMLtc89egfv55WkLCQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Jul 2026 11:19:16 +0000</pubDate>                                                                                                                                <updated>Tue, 21 Jul 2026 12:04:55 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/ehLfvMLtc89egfv55WkLCQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Garmin]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of the Garmin Cirqa]]></media:description>                                                            <media:text><![CDATA[a photo of the Garmin Cirqa]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of the Garmin Cirqa]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ehLfvMLtc89egfv55WkLCQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Garmin's long-rumored screenless fitness tracker, the Garmin Cirqa, has finally been unveiled. Pricier than the beginner-friendly <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> but more affordable than the pro-level <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a>, the Cirqa aims to offer the best of both in a lightweight, discreet package.</p><p>We checked out the new Garmin Cirqa on launch day; find out hands-on impressions below to learn more about the cost, design, features, battery life, and outlook for the new Garmin Cirqa. </p><h3 class="article-body__section" id="section-garmin-cirqa-cheat-sheet"><span>Garmin Cirqa: Cheat sheet</span></h3><ul><li><strong>Price: </strong>$199/£179, no subscription required</li><li><strong>Design:</strong> Lightweight, screen-free fitness-tracking band</li><li><strong>Key features: </strong>Basic health and fitness tracking insights, including 24/7 heart rate tracking, Sp02, nightly sleep reports, women's health tracking</li><li><strong>Battery life</strong>: Up to 10 days</li><li><strong>Launch date:</strong> July 24, 2026</li></ul><h3 class="article-body__section" id="section-garmin-cirqa-price-and-availability"><span>Garmin Cirqa: price and availability </span></h3><p>The Garmin Cirqa fitness tracker will be available on July 24 for $199/ £179. The device is subscription-free, but for additional insights, users can optionally sign up for Garmin Connect+ for $6.99 per month or $69.99 per year.</p><p>By comparison, the Fitbit Air is just $99 and also subscription-optional. The Whoop 5.0, meanwhile, ranges from $199, $239, or $359 per year depending on your membership tier. However, the device itself is free. </p><h3 class="article-body__section" id="section-garmin-cirqa-design"><span>Garmin Cirqa: 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:2200px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="Br5dC48ohmoX2Pe36DuP4e" name="CIRQA_Smart_Band_Photo" alt="a photo of the Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/Br5dC48ohmoX2Pe36DuP4e.jpg" mos="" align="middle" fullscreen="" width="2200" height="1237" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Garmin)</span></figcaption></figure><p>The Garmin Cirqa looks a whole lot like the Whoop 5.0, a design choice I can only assume was intentional. Users can choose between four band colors, including Black, Captain Blue, Mauve, and French Gray. </p><p><a href="https://www.garmin.com/en-US/p/1970320/pn/010-14472-00/" target="_blank" rel="nofollow">Additional bands</a> are available at $49.99/$59.99, depending on whether you want to wear the band around your wrist or upper arm, and include three additional colors: Citron Gray, Dark Olive, and French Blue.</p><p>The device comes in two sizes, small/medium and large/extra large. </p><p>The tracker itself is held securely within the fabric loop with no screen and just a single button on the side.</p><h3 class="article-body__section" id="section-garmin-cirqa-health-and-fitness"><span>Garmin Cirqa: Health and fitness </span></h3><p>The Garmin Cirqa sports the brand's Elevate V4 sensor, which is one generation out from the latest/greatest. Onboard health tools include 24/7 heart rate tracking, Sp02 readings, body temperature monitoring, and women's health tracking. </p><p>Like the<a href="https://www.tomsguide.com/best-picks/best-garmin-watch"> best Garmin watches </a>in 2026, the Cirqa provides detailed nightly sleep reports and can automatically track a range of common workout types.  </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5547px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hNj2VkC65xdUAHProcSZ2o" name="CIRQA_Smart_Band_HERO_1" alt="a photo of the Garmin Cirqa" src="https://cdn.mos.cms.futurecdn.net/hNj2VkC65xdUAHProcSZ2o.jpg" mos="" align="middle" fullscreen="" width="5547" height="3120" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Garmin)</span></figcaption></figure><h3 class="article-body__section" id="section-garmin-cirqa-battery"><span>Garmin Cirqa: Battery</span></h3><p>Battery life for the Cirqa is rated at up to 10 days.</p><p>By comparison, the Fitbit Air lasts right around one week per charge, while the Whoop 5.0 is good for closer to two weeks per charge. </p><h3 class="article-body__section" id="section-garmin-cirqa-vs-whoop-vs-fitbit-air"><span>Garmin Cirqa vs Whoop vs Fitbit Air</span></h3><p>Like any screen-free wearable, whether we're talking about the <a href="https://www.tomsguide.com/wellness/fitness-trackers/best-smart-rings">best smart rings</a> or the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a>/bands, the companion app can make or break the overall experience. With that in mind, the Garmin Connect app is comprehensive enough, though for first-time users, insights can feel a bit scattered and overwhelming. </p><p>Ultimately, I look forward to testing the new Garmin Cirqa head-to-head versus both the $99 Fitbit Air and higher-end Whoop 5.0. If it can offer just a little more, holistic-insight-wise, than the Fitbit Air, then it very well may be worth the extra $100.</p><p>Stay tuned for my full Garmin Cirqa review.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/ive-tested-over-100-fitness-trackers-head-to-head-3-workout-stats-i-trust-the-least">I’ve tested over 100 fitness trackers head-to-head — 3 workout stats I trust the least</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/3-reasons-why-google-should-make-an-oura-ring-alternative">It's time for a Fitbit Ring — 3 reasons why Google should make an Oura Ring alternative</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I swear by these 2 hidden Apple Watch features that will save you time every day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/i-swear-by-these-2-hidden-apple-watch-features-that-will-save-you-time-every-day</link>
                                                                            <description>
                            <![CDATA[ Cut through the noise with these Apple Watch shortcuts that will make using the smartwatch faster and easier. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">PKHEhYXNBkqvTHiSmDK85a</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FZ3rixyo4rPrgpLYLC37aX-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 20 Jul 2026 12:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nick Harris-Fry ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/J5Jjp49GUVjLZEbjEkTex.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick has been a journalist since 2012 and has spent most of that time writing about health and fitness for a variety of publications. Nick spent nine years working on the Coach magazine and website before moving to the fitness team at Tom’s Guide in 2024. Nick is a keen runner and also the founder of YouTube channel &lt;a href=&quot;https://www.youtube.com/channel/UCOBM9FasII4dKbyE_HKkbjw&quot;&gt;The Run Testers&lt;/a&gt;, which specialises in reviewing running shoes, watches, headphones and other gear.&lt;/p&gt;&lt;p&gt;Nick has covered all aspects of health and fitness throughout his career, interviewing experts and celebrities, trying fitness classes and running marathons, all in the name of providing readers with the information they need to get the most out of an active lifestyle.&lt;/p&gt;&lt;p&gt;Nick ran his first marathon in 2016 after six weeks of training for a magazine feature and subsequently became obsessed with the sport. He now has PBs of 2hr 25min for the marathon and 15min 30sec for 5K, and has run 16 marathons in total, as well as a 50-mile ultramarathon.&lt;/p&gt;&lt;p&gt;Nick runs 60-90 miles a week and races regularly with his club, which gives him a lot of opportunity to test out running gear: he has tested and reviewed hundreds of pairs of running shoes, as well as fitness trackers, running watches, sports headphones, treadmills, and all manner of other kit. Nick is also a qualified Run Leader in the UK.&lt;/p&gt;&lt;p&gt;Nick is an established expert in the health and fitness area and along with writing for several publications, including &lt;a href=&quot;https://www.livescience.com/author/nick-harris-fry&quot;&gt;Live Science&lt;/a&gt;, &lt;a href=&quot;https://www.expertreviews.co.uk/authors/nick-harris-fry&quot;&gt;Expert Reviews&lt;/a&gt;, &lt;a href=&quot;https://www.wareable.com/author/n.harris-fry&quot;&gt;Wareable&lt;/a&gt;, &lt;a href=&quot;https://www.coachweb.com/author/nick-harris-fry&quot;&gt;Coach&lt;/a&gt; and &lt;a href=&quot;https://www.getsweatgo.com/author/n.harrisfry&quot;&gt;Get Sweat Go&lt;/a&gt;, he has been quoted on &lt;a href=&quot;https://www.theguardian.com/thefilter/2024/oct/20/if-you-pay-more-than-4-youre-being-ripped-off-the-fair-price-for-14-everyday-items-from-cleaning-spray-to-olive-oil&quot;&gt;The Guardian&lt;/a&gt; and &lt;a href=&quot;https://www.independent.co.uk/life-style/health-and-families/london-marathon-2021-date-training-tips-summer-running-a9482486.html&quot;&gt;The Independent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Nick graduated from the University of York in 2010 with a degree in Politics, Philosophy and Economics and worked in the NHS for three years, during which time he completed his NCTJ Diploma in Journalism at News Associates in London. Before starting on Coach and moving into health and fitness, Nick worked as a football journalist and lived in Kathmandu, Nepal for two years.&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/FZ3rixyo4rPrgpLYLC37aX-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple Watch Series 11 shortcuts]]></media:description>                                                            <media:text><![CDATA[Apple Watch Series 11 shortcuts]]></media:text>
                                <media:title type="plain"><![CDATA[Apple Watch Series 11 shortcuts]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FZ3rixyo4rPrgpLYLC37aX-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Apple Watch is absolutely packed with features, and while that’s undoubtedly a good thing, it also means there are a lot of menus and apps on the watch, which can slow down your navigation and make it harder to get straight to the things you want to do.</p><p>Fortunately, there are a lot of clever shortcuts available on the watch to speed up your usage, and two I use all the time when wearing the watch make it faster to navigate the menus and fire up a workout.</p><p>I use these shortcuts on an <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch Series 11</a> because one of them is essentially a replacement for the Action button on the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3,</a> so it is only needed on Series watches, but the first hidden feature is one that applies to all of the <a href="https://www.tomsguide.com/best-picks/best-apple-watch">best Apple watches</a>.</p><h3 class="article-body__section" id="section-tip-1-tap-the-time-to-jump-to-the-top"><span>Tip #1 — tap the time to jump to the top</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:3423px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Bp23bYaCMBVyzkmu3zjgcX" name="Apple Watch Series 11 shortcuts" alt="Apple Watch Series 11 shortcuts" src="https://cdn.mos.cms.futurecdn.net/Bp23bYaCMBVyzkmu3zjgcX.jpg" mos="" align="middle" fullscreen="" width="3423" height="1925" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you’ve ever found yourself down at the bottom of a very long Apple Watch menu, knowing that you now need to scroll all the way back to the top to find the setting you need, this tip’s for you.</p><p>Simply tap the time in any native Apple Watch app, and it will teleport you back to the top of the menu instantly. </p><p>This works in apps like Mail, Workout and Settings, and I find it saves me time every day when I’m working my way around the various menus and options in those apps.</p><p>If you just want to head back to your watch face from wherever you are in an app, you can also cover the Apple Watch with your palm for a second, and it will transport you there.</p><h3 class="article-body__section" id="section-tip-2-create-one-tap-shortcuts-to-your-favorite-workouts"><span>Tip #2 — create one-tap shortcuts to your favorite workouts</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:4110px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2iY8ByEmSWWFAioTLQrqgX" name="Apple Watch Series 11 shortcuts" alt="Apple Watch Series 11 shortcuts" src="https://cdn.mos.cms.futurecdn.net/2iY8ByEmSWWFAioTLQrqgX.jpg" mos="" align="middle" fullscreen="" width="4110" height="2312" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’m a keen runner and often use the Apple Watch Ultra 3 instead of the Series 11, partly because the Action button is a handy way to start a run quickly.</p><p>With this feature, you can create a similar feature on any Series Apple Watch, adding a shortcut to starting a run or any workout to your Control Center.</p><p><strong>Here’s how to do it:</strong></p><ol start="1"><li>In the Shortcuts app on your iPhone, create a new shortcut to start a run (or any workout type)</li><li>Long-press this shortcut and tick "show on Apple Watch"</li><li>You can also customize the icon for the shortcut in the iPhone app and rename it</li><li>Press the side button on your Apple Watch to open the Control Center</li><li>Scroll down to edit, then hit the "+" icon to add your shortcut</li><li>Find your new shortcut and position it where you want in your Control Center</li></ol><p>Now when you hit that shortcut in the Control Center, it will immediately open the Workout app and start your chosen training session, almost as quickly as if you’d used the Action button on an Ultra.</p><p>You can also add your shortcut directly to a watch face if you have one with complications, meaning you don’t even need to open the Control Center.</p><p>I have shortcuts for outdoor run and functional strength training workouts set up on my watch, so I can fire them up with just one or two taps.</p><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBzBKe"></div>                            </div>                            <script src="https://kwizly.com/embed/eBzBKe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3">Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve tested over 100 fitness trackers head-to-head — 3 workout stats I trust the least ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/ive-tested-over-100-fitness-trackers-head-to-head-3-workout-stats-i-trust-the-least</link>
                                                                            <description>
                            <![CDATA[ Not all smartwatches or fitness trackers get these basic workout stats wrong, but a surprising amount do. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vfFaEqZgofmCRrd7daEqC9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Lroa7D5aKGPJEjsjwKJkB7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 18 Jul 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/Lroa7D5aKGPJEjsjwKJkB7-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Amazfit Active Max next to the Garmin Forerunner 570 on a bright orange table]]></media:description>                                                            <media:text><![CDATA[Close-up of the Amazfit Active Max next to the Garmin Forerunner 570 on a bright orange table]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Amazfit Active Max next to the Garmin Forerunner 570 on a bright orange table]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Lroa7D5aKGPJEjsjwKJkB7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I test a lot of smartwatches and fitness trackers here at Tom’s Guide. I mean A LOT. If the device was released in the past three years, there’s a very good chance I’ve not only helped to review it but also tested it head-to-head against the competition.</p><p>The vast majority of name-brand wearables track heart rate, distance, and step count — assuming you're going for a walk or hike — with impressive consistency, in my experience. For example, I’ve performed <a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out">dozens of walk tests</a> where I wear a device on either wrist and manually count my steps to see which comes closer.</p><p>Not only do most modern wearables come within a few hundred steps of my actual count — an impressive accomplishment when we're talking 5,000 or more steps per walk — but most also report similar distance data, down to a few tenths of a mile, and broadly the same heart rate data, give or take a handful of beats per minute. </p><p>That said, there are three workout stats that are consistently, well... inconsistent. And it's not just wallet-friendly models that struggle; even some of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> and <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a> occasionally have hiccups tracking these metrics. </p><h3 class="article-body__section" id="section-the-three-fitness-tracking-stats-i-trust-the-least"><span>The three fitness tracking stats I trust the least</span></h3><h3 class="article-body__section" id="section-1-elevation-gain"><span>1. Elevation gain</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:5011px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="mKcWHy4FyfXAdxg6cMjXUM" name="Forerunner70-02" alt="Close-up of the Garmin Forerunner 70 entry-level running watch in white" src="https://cdn.mos.cms.futurecdn.net/mKcWHy4FyfXAdxg6cMjXUM.jpg" mos="" align="middle" fullscreen="" width="5011" height="2818" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>As an avid <a href="https://www.tomsguide.com/wellness/smartwatches/i-took-the-apple-watch-ultra-3-vs-garmin-instinct-3-snowboarding-and-there-was-one-clear-winner">mountain sports enthusiast</a> and someone who enjoys urban hiking and <a href="https://www.tomsguide.com/wellness/smartwatches/i-biked-11-miles-with-the-apple-watch-ultra-3-vs-strava-and-theres-a-clear-winner">biking</a> in a particularly hilly part of the U.S. (Seattle, WA), inconsistent elevation tracking seriously irks me. For example, it’s not unusual for a standard midday, two-mile walk to involve several hundred feet of climb.</p><p>Unfortunately, a lot of wearables come up short when it comes to assessing upward effort. </p><p>Not only that, some popular wearables don’t even offer a metric for elevation gain in the post-workout report, like the <a href="https://www.tomsguide.com/reviews/fitbit-inspire-3">Fitbit Inspire 3</a>. Others, like the newer <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> — a wearable I otherwise really like — measure elevation about as accurately as a <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-apple-watch-11-vs-fitbit-air-and-theres-a-clear-winner">newborn shooting pool</a>.</p><p>Even the <a href="https://www.tomsguide.com/best-picks/best-apple-watch">best Apple Watch</a> models occasionally report inaccurate climb data. From my experience, the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Ultra 3</a> is rock-solid, but both the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Series 11</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-se-3-review">SE 3</a> have been known to log <a href="https://www.tomsguide.com/wellness/smartwatches/i-walked-5-550-steps-with-the-apple-watch-11-vs-apple-watch-se-3-and-im-genuinely-surprised-by-the-results">slightly inflated elevation</a> stats from time to time.</p><p>For what it’s worth, the brand I’ve found most consistent with elevation tracking is Garmin, that is, assuming you purchase one of the <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">best Garmin </a>watches, specifically, one with an onboard barometric altimeter. The new <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-forerunner-70-review">Forerunner 70</a>, for example, lacks one.</p><h3 class="article-body__section" id="section-2-pace"><span>2. Pace</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:3692px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="aWCNwEsfVamfA2tPee55CW" name="AW11-v-AW-SE3-02" alt="Close-up of the Apple Watch SE 3 and Apple Watch Series 11 in a user's hand with a colorful, out-of-focus background" src="https://cdn.mos.cms.futurecdn.net/aWCNwEsfVamfA2tPee55CW.jpg" mos="" align="middle" fullscreen="" width="3692" height="2077" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Speaking of Garmin, it’s one of the few smartwatch brands that provides two pace metrics for outdoor activities like walks, hikes, runs, and bike rides: an average moving pace and an average elapsed (total) pace. </p><p>For most of us, the former is the more valuable metric, as it ignores long pauses — like waiting at a traffic light or stopping for a sip of water — thereby providing a more accurate measure of your <em>actual</em> moving effort. </p><p>Unfortunately, brands like Apple and Google only offer one pace metric in their respective workout reports. And though they don’t specify which pace metric it is, it's almost always slower than the competition’s moving pace stat, suggesting both are reporting elapsed pace, the less valuable one.</p><h3 class="article-body__section" id="section-3-calories"><span>3. Calories</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:3215px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="42FrbtdE7qLX8u4Kv6drRi" name="AW10-v-GalaxyWatch8-01" alt="Close-up of the Apple Watch Series 10 and Samsung Galaxy Watch 8 Classic in a user's hand showing the results of a logged bike ride" src="https://cdn.mos.cms.futurecdn.net/42FrbtdE7qLX8u4Kv6drRi.jpg" mos="" align="middle" fullscreen="" width="3215" height="1809" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Post-workout calorie counts are perhaps the most all over the place in my testing. For example, it’s not uncommon for one device to log <a href="https://www.tomsguide.com/wellness/smartwatches/i-walked-7-500-steps-with-the-apple-watch-se-3-vs-amazfit-active-max-and-theres-a-clear-winner">one hundred or more calories</a> burned than another after the exact same workout. </p><p>In fact, this metric tends to be so inconsistent that I mostly ignore it completely. Not only are most manufacturers opaque about how the calorie counts are even calculated in the first place, but key factors like a user's metabolism or muscle mass are rarely taken into account when generating them. </p><p>Which fitness tracking stats do you think are bupkis? Let me know in the poll below.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xr0NKW"></div>                            </div>                            <script src="https://kwizly.com/embed/Xr0NKW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out"><strong>Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out</strong></a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-walked-5-500-steps-with-the-apple-watch-se-3-vs-garmin-forerunner-70-and-this-smartwatch-won"><strong>I walked 5,500 steps with the Apple Watch SE 3 vs Garmin Forerunner 70 — and the results surprised me</strong></a></li><li><a href="https://www.tomsguide.com/wellness/fitness/i-ran-a-5k-with-the-garmin-forerunner-570-vs-apple-watch-ultra-3-5-things-i-learned"><strong>I ran a 5K with the Garmin Forerunner 570 vs Apple Watch Ultra 3, and although the pace data matched up perfectly across both devices, the Garmin’s exercise load metric and detailed vertical ratio analysis made it the clear winner</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Hate wearing a watch to bed? Try this $400 sleep tracking headband instead, which helped me sleep through the night ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/sleep-tech/hate-wearing-a-watch-to-bed-try-this-usd400-sleep-tracking-headband-instead-which-helped-me-sleep-through-the-night</link>
                                                                            <description>
                            <![CDATA[ After thorough testing the Muse S Athena is an obvious addition to our sleep trackers buying guide. Here's why... ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HsZ86EAVbSNeiXTmEYymqC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/atmVxfFgr5Yv8BaYJnoAKL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 16 Jul 2026 17:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sleep Tech]]></category>
                                                    <category><![CDATA[Sleep]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ ruth.jones@futurenet.com (Ruth Jones) ]]></author>                    <dc:creator><![CDATA[ Ruth Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Cqbswyyro7aBYnvMKaoS6W.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/atmVxfFgr5Yv8BaYJnoAKL-1280-80.jpg">
                                                            <media:credit><![CDATA[Muse | Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[On the left, our tester Ruth jones wearing the Muse S Athena sleep headband. On the right, a close up of the sensors on the inside of the Muse S Athena sleep headband]]></media:description>                                                            <media:text><![CDATA[On the left, our tester Ruth jones wearing the Muse S Athena sleep headband. On the right, a close up of the sensors on the inside of the Muse S Athena sleep headband]]></media:text>
                                <media:title type="plain"><![CDATA[On the left, our tester Ruth jones wearing the Muse S Athena sleep headband. On the right, a close up of the sensors on the inside of the Muse S Athena sleep headband]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/atmVxfFgr5Yv8BaYJnoAKL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Why do watches dominate the sleep tracking industry? They're bulky and uncomfortable, so it's time to take a stand... with a headband. The <a href="https://choosemuse.com/products/muse-s-athena" target="_blank"><strong>Muse S Athena, from $474.99 at Muse</strong></a>, is a gold-standard sleep tracking headband with lab-grade sensors. What's more, it might actually improve your sleep.</p><p>Having just tested the Muse S Athena, it was an obvious choice for our guide to the <a href="https://www.tomsguide.com/wellness/sleep-tech/best-sleep-tracker">best sleep trackers</a>. It's packed full of sensors to create a detailed picture of your sleep quality. And, as someone who hates sleeping in a watch but uses an eye mask nightly, it's a comfortable alternative to most wearables.</p><p>Plus, while my smartwatch has many great features, the Muse is at the forefront of sleep tech. In my <a href="https://www.tomsguide.com/wellness/sleep-tech/muse-s-athena-review">Muse S Athena review</a> I was blown away by the sleep intervention features. It literally reads your mind (well, your brainwaves) and then uses sound frequencies to improve your sleep. </p><div class="product"><a data-dimension112="3ce8e492-8126-11f1-a076-cdadc77a9ed2" data-action="Deal Block" data-label="The Muse S Athena is a sleep tracking headband and meditation device. Prices start at $474.99 and you need to pay for a subscription to access the entire line-up of features. (We tested the free tier, however, and found it packed with options.)" data-dimension48="The Muse S Athena is a sleep tracking headband and meditation device. Prices start at $474.99 and you need to pay for a subscription to access the entire line-up of features. (We tested the free tier, however, and found it packed with options.)" data-dimension25="$474.99" href="https://choosemuse.com/products/muse-s-athena" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="fuhh7N7zkyqQZBhHApTWQ8" name="Muse S Athena deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fuhh7N7zkyqQZBhHApTWQ8.jpg" mos="" align="middle" fullscreen="" width="900" height="900" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Muse S Athena is a sleep tracking headband and meditation device. Prices start at $474.99 and you need to pay for a subscription to access the entire line-up of features. (We tested the free tier, however, and found it packed with options.)<a class="view-deal button" href="https://choosemuse.com/products/muse-s-athena" target="_blank" rel="nofollow" data-dimension112="3ce8e492-8126-11f1-a076-cdadc77a9ed2" data-action="Deal Block" data-label="The Muse S Athena is a sleep tracking headband and meditation device. Prices start at $474.99 and you need to pay for a subscription to access the entire line-up of features. (We tested the free tier, however, and found it packed with options.)" data-dimension48="The Muse S Athena is a sleep tracking headband and meditation device. Prices start at $474.99 and you need to pay for a subscription to access the entire line-up of features. (We tested the free tier, however, and found it packed with options.)" data-dimension25="$474.99">View Deal</a></p></div><h2 id="sleep-intervention-takes-sleep-tracking-to-the-next-level">Sleep intervention takes sleep tracking to the next level</h2><p>The Muse S Athena excels as a sleep tracker. But I'll be honest, you can get trackers almost as good for a fraction of the price. </p><p>If you want details of your brain activity overnight, the Muse is worth it. If you just want to know how long you slept for and if you got good quality sleep, the <a href="https://www.tomsguide.com/wellness/sleep-tech/withings-sleep-analyzer-review">Withings Sleep Mat</a> is a wearables-free alternative for under $200.</p><p>But it's not really about the sleep tracking here. It's what Muse does with this information that makes it so interesting.</p><p>Muse has two (free) features that stand-out. The first is Sleep Assist. Used before bed, these sleep sounds and meditations gently lull you towards slumber. And when the Muse detects your brainwaves are changing, it adjusts the sounds to match your sleepiness.</p><p>The second is Deep Sleep Boost. Starting after you've fallen asleep, when the Muse detects slow brainwaves, it plays frequencies designed to strengthen this restorative sleep phase. As a result, you should <a href="https://www.tomsguide.com/wellness/sleep/how-much-deep-sleep-do-you-need">sleep deeper</a> and wake up fresher.</p><p>So a must have for our sleep tracking guide... and an early contender for our guide to the 'best gadgets straight out of science fiction.'</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3 at fitness tracking? I manually counted 4,500 steps to find out ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/can-the-usd99-fitbit-air-beat-the-usd799-apple-watch-ultra-3-at-fitness-tracking-i-manually-counted-4-500-steps-to-find-out</link>
                                                                            <description>
                            <![CDATA[ I wanted to find out if a $99 Fitbit can compete with a $799 Apple Watch to track a basic workout so I counted out the steps while wearing both. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gyus8k88TVomBvo9ULVyjj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/jbht4R2m2ZyXg96fHtRNy8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 16 Jul 2026 16:41:22 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/jbht4R2m2ZyXg96fHtRNy8-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Apple Watch Ultra 3 and Fitbit Air]]></media:description>                                                            <media:text><![CDATA[Close-up of the Apple Watch Ultra 3 and Fitbit Air]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Apple Watch Ultra 3 and Fitbit Air]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/jbht4R2m2ZyXg96fHtRNy8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Can the $99 Fitbit Air beat the $799 Apple Watch Ultra 3? I manually counted 4,500 steps to find out.</p><p>Steps are, of course, just one of the many metrics these high-tech wearables keep tally of, but for this head-to-head, it’s the primary figure I’ll be using to declare a winner. </p><p>I also tracked my <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> vs <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3</a> walk using the Strava app as a control for distance, climb, and pace.</p><p>Read on for the results!</p><div class="product"><a data-dimension112="ea922704-8089-11f1-ab35-9bdb9843106c" data-action="Deal Block" data-label="best fitness trackers" data-dimension48="best fitness trackers" data-dimension25="$99" href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:858px;"><p class="vanilla-image-block" style="padding-top:95.22%;"><img id="6rQV9bADzd2zqYvNPGPxwE" name="Screenshot 2026-05-28 at 12.55.35 PM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6rQV9bADzd2zqYvNPGPxwE.png" mos="" align="middle" fullscreen="" width="858" height="817" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>With no screen, buttons, or alerts to distract you — plus nearly a week of battery — the Fitbit Air is as easy-going as it is affordable. It’s also one of the <a href="https://www.tomsguide.com/us/best-fitbit,review-3203.html" data-dimension112="ea922704-8089-11f1-ab35-9bdb9843106c" data-action="Deal Block" data-label="best fitness trackers" data-dimension48="best fitness trackers" data-dimension25="$99">best fitness trackers </a>of the year.<a class="view-deal button" href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV?th=1" target="_blank" rel="nofollow" data-dimension112="ea922704-8089-11f1-ab35-9bdb9843106c" data-action="Deal Block" data-label="best fitness trackers" data-dimension48="best fitness trackers" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="ea92277c-8089-11f1-a288-7d29c57a3eec" data-action="Deal Block" data-label="best smartwatches" data-dimension48="best smartwatches" data-dimension25="$729" href="https://www.bestbuy.com/product/apple-watch-ultra-3-gps-cellular-49mm-titanium-case-with-black-alpine-loop-medium-black-2025/JJGCQL87VH/sku/6572974" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jZmNn7NgmEcxvn6y45BBZX" name="Apple Watch Ultra 3 sq" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jZmNn7NgmEcxvn6y45BBZX.jpg" mos="" align="middle" fullscreen="" width="1600" height="1600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Its name says it all. The Apple Watch Ultra 3 is Cupertino’s toughest-built, longest-lasting, most feature-packed smartwatch. No wonder it’s one of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch" data-dimension112="ea92277c-8089-11f1-a288-7d29c57a3eec" data-action="Deal Block" data-label="best smartwatches" data-dimension48="best smartwatches" data-dimension25="$729">best smartwatches</a> of 2026<a class="view-deal button" href="https://www.bestbuy.com/product/apple-watch-ultra-3-gps-cellular-49mm-titanium-case-with-black-alpine-loop-medium-black-2025/JJGCQL87VH/sku/6572974" target="_blank" rel="nofollow" data-dimension112="ea92277c-8089-11f1-a288-7d29c57a3eec" data-action="Deal Block" data-label="best smartwatches" data-dimension48="best smartwatches" data-dimension25="$729">View Deal</a></p></div><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/LCKJ8K4sdXk" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-can-a-99-fitbit-beat-a-799-apple-watch"><span>Can a $99 Fitbit beat a $799 Apple Watch?</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:4398px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PbdEY3fyuMA89RVPd3VUx7" name="AWU3-v-FitbitA-01" alt="Close-up of the Apple Watch Ultra 3 and Fitbit Air" src="https://cdn.mos.cms.futurecdn.net/PbdEY3fyuMA89RVPd3VUx7.jpg" mos="" align="middle" fullscreen="" width="4398" height="2474" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>But first, if you’re thinking that this isn’t really a fair competition given the price difference between the Fitbit Air and Apple Watch Ultra 3, you’d be right! But who doesn’t love a good old-fashioned underdog showdown? </p><p>It is worth noting just a few of the key differences between these two trendy wearables before moving on to the outcome. The Fitbit Air is a discreet, screen-free health and fitness tracker with no buttons, notifications, or onboard GPS. While tracking a workout, the Air relies on a paired smartphone for location and elevation data. </p><p>The Apple Watch Ultra 3 sports a sizable, ultra-bright display and is easily one of the most high-tech, feature-packed smartwatches on the market. It boasts a dual-frequency GPS antenna and dedicated altimeter for logging outdoor adventures. </p><p>With that out of the way, here are the results of my 4,500-step walk test between the $99 Fitbit Air and the $799 Apple Watch Ultra 3. </p><h3 class="article-body__section" id="section-fitbit-air-vs-apple-watch-ultra-3-walk-test-results"><span>Fitbit Air vs Apple Watch Ultra 3: Walk test results </span></h3><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Fitbit Air</p></th><th  ><p>Apple Watch Ultra 3</p></th><th  ><p>Control</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steps</strong></p></td><td  ><p>4,375 steps</p></td><td  ><p>4,469 steps</p></td><td  ><p>4,500 (manual count)</p></td></tr><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>2.36 miles</p></td><td  ><p>2.39 miles</p></td><td  ><p>2.45  miles (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Climb</strong></p></td><td  ><p>No data</p></td><td  ><p>377 feet</p></td><td  ><p>360 feet (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average pace </strong></p></td><td  ><p>18 mins 11 secs</p></td><td  ><p>17 mins 44 secs</p></td><td  ><p>17 mins 21 secs (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>133 bpm</p></td><td  ><p>138 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>165 bpm</p></td><td  ><p>166 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned</strong></p></td><td  ><p>354 calories</p></td><td  ><p>371 calories </p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Battery usage</strong></p></td><td  ><p>1%</p></td><td  ><p>4%</p></td><td  ><p>n/a</p></td></tr></tbody></table></div><p>Both wearables calculated my total steps with passable accuracy, but the Ultra 3 was closer. As a rule of thumb, I consider any step count total that's within ~150 steps of my actual count to be within a reasonable margin for error/impressive.</p><p>Strava, for what's worth, noted 4,496 total steps.</p><p>The Fitbit Air's distance measurement is a little further off from the control than the Apple Watch Ultra 3's, but not by a concerning amount. </p><p>What is a tad concerning is the fact that Google seemingly removed climb data from the post-workout report. Notably, because every other time I've logged a walking workout using the Air, the metric was 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:3903px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="EvMxy8b2KjzH2ks5YVcSAA" name="FitbitAir-06" alt="Hands-on with the Fitbit Air on the orange and brown Stephen Curry strap" src="https://cdn.mos.cms.futurecdn.net/EvMxy8b2KjzH2ks5YVcSAA.jpg" mos="" align="middle" fullscreen="" width="3903" height="2195" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>However, after some poking around, it appears the lack of climb data may be due to my inadvertently changing the Google Health app's location data setting on my paired phone from "always" to "while using the app" via an ill-timed pop-up. </p><p>Then again, I had the app open for the duration of my test, and it managed to pull all the other usual location-based metrics, so I'm not 100% convinced this caused the hiccup.</p><p>Coincidentally, as noted in my<a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-000-steps-with-the-fitbit-air-vs-pixel-watch-4-and-im-genuinely-shocked-by-the-results"> Fitbit Air vs Pixel Watch 4</a> and<a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-apple-watch-11-vs-fitbit-air-and-theres-a-clear-winner"> Fitbit Air vs Apple Watch <u>11</u></a> walk tests, accurate elevation tracking isn't exactly the Air's strong suit. Whether inconsistent or missing entirely, I'm hopeful this is something Google irons out with future firmware.</p><p>Moving on, the Fitbit Air noted a slower pace than the competition, which is a bit strange, given it measured less distance than Strava and the Ultra 3. More reassuringly, heart rate and calorie data from the Fitbit and Apple Watch pretty much align for this hilly, ~42-minute walk.</p><h3 class="article-body__section" id="section-fitbit-air-vs-apple-watch-ultra-3-winner"><span>Fitbit Air vs Apple Watch Ultra 3: Winner </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:3816px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ojGeHvLY8ci8xyzHZZBa38" name="AW-Ultra3-01" alt="Close-up of the Apple Watch Ultra 3" src="https://cdn.mos.cms.futurecdn.net/ojGeHvLY8ci8xyzHZZBa38.jpg" mos="" align="middle" fullscreen="" width="3816" height="2147" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>When pondering whether the $99 Fitbit Air can keep up with the $799 Apple Watch Ultra 3 at reliably tracking an outdoor workout, the answer is, well, not quite. The Apple Watch Ultra 3 proved more precise across the board, not just at tracking total steps, but pace and climb, too.</p><p>When it comes to the Fitbit Air, even though it didn't log my workout as accurately as its pricier rival, the results were still in the ballpark (missing elevation data aside). For most folks, myself included, that's more than good enough for my exercise logging needs. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OqRBRX"></div>                            </div>                            <script src="https://kwizly.com/embed/OqRBRX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-3-000-steps-with-the-fitbit-air-vs-garmin-forerunner-70-and-im-seriously-amazed-by-the-results">I walked 3,000 steps with the Fitbit Air vs Garmin Forerunner 70 — and I’m seriously amazed by the results</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/the-fitbit-air-is-basically-just-a-screen-less-fitbit-inspire-3-and-thats-a-very-good-thing">The Fitbit Air is basically just a screen-less Fitbit Inspire 3 — and that’s a very good thing</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Not the Fenix 9 — 4 reasons why I think the Garmin Enduro 4 could be the adventure watch to look out for in 2026 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/not-the-fenix-9-4-reasons-why-i-think-the-garmin-enduro-4-could-be-the-adventure-watch-to-look-out-for-in-2026</link>
                                                                            <description>
                            <![CDATA[ The Garmin Fenix 9 is the biggest sports watch launch to come in 2026, but the Garmin Enduro 4 might well end up the most exciting new arrival for adventurers. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CKRdDut2f3vqdQ7xzFcPEg</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CUejPqjarLjrQFDHfkpP35-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 16 Jul 2026 09:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nick Harris-Fry ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/J5Jjp49GUVjLZEbjEkTex.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick has been a journalist since 2012 and has spent most of that time writing about health and fitness for a variety of publications. Nick spent nine years working on the Coach magazine and website before moving to the fitness team at Tom’s Guide in 2024. Nick is a keen runner and also the founder of YouTube channel &lt;a href=&quot;https://www.youtube.com/channel/UCOBM9FasII4dKbyE_HKkbjw&quot;&gt;The Run Testers&lt;/a&gt;, which specialises in reviewing running shoes, watches, headphones and other gear.&lt;/p&gt;&lt;p&gt;Nick has covered all aspects of health and fitness throughout his career, interviewing experts and celebrities, trying fitness classes and running marathons, all in the name of providing readers with the information they need to get the most out of an active lifestyle.&lt;/p&gt;&lt;p&gt;Nick ran his first marathon in 2016 after six weeks of training for a magazine feature and subsequently became obsessed with the sport. He now has PBs of 2hr 25min for the marathon and 15min 30sec for 5K, and has run 16 marathons in total, as well as a 50-mile ultramarathon.&lt;/p&gt;&lt;p&gt;Nick runs 60-90 miles a week and races regularly with his club, which gives him a lot of opportunity to test out running gear: he has tested and reviewed hundreds of pairs of running shoes, as well as fitness trackers, running watches, sports headphones, treadmills, and all manner of other kit. Nick is also a qualified Run Leader in the UK.&lt;/p&gt;&lt;p&gt;Nick is an established expert in the health and fitness area and along with writing for several publications, including &lt;a href=&quot;https://www.livescience.com/author/nick-harris-fry&quot;&gt;Live Science&lt;/a&gt;, &lt;a href=&quot;https://www.expertreviews.co.uk/authors/nick-harris-fry&quot;&gt;Expert Reviews&lt;/a&gt;, &lt;a href=&quot;https://www.wareable.com/author/n.harris-fry&quot;&gt;Wareable&lt;/a&gt;, &lt;a href=&quot;https://www.coachweb.com/author/nick-harris-fry&quot;&gt;Coach&lt;/a&gt; and &lt;a href=&quot;https://www.getsweatgo.com/author/n.harrisfry&quot;&gt;Get Sweat Go&lt;/a&gt;, he has been quoted on &lt;a href=&quot;https://www.theguardian.com/thefilter/2024/oct/20/if-you-pay-more-than-4-youre-being-ripped-off-the-fair-price-for-14-everyday-items-from-cleaning-spray-to-olive-oil&quot;&gt;The Guardian&lt;/a&gt; and &lt;a href=&quot;https://www.independent.co.uk/life-style/health-and-families/london-marathon-2021-date-training-tips-summer-running-a9482486.html&quot;&gt;The Independent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Nick graduated from the University of York in 2010 with a degree in Politics, Philosophy and Economics and worked in the NHS for three years, during which time he completed his NCTJ Diploma in Journalism at News Associates in London. Before starting on Coach and moving into health and fitness, Nick worked as a football journalist and lived in Kathmandu, Nepal for two years.&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/CUejPqjarLjrQFDHfkpP35-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin Enduro 3]]></media:description>                                                            <media:text><![CDATA[Garmin Enduro 3]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin Enduro 3]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CUejPqjarLjrQFDHfkpP35-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Earlier this year, Garmin CEO Cliff Pemble tipped that <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-plans-a-significant-number-of-new-product-introductions-in-its-outdoor-segment-in-2026-could-this-mean-the-fenix-9">2026 was set to be a big year for its outdoor division</a>, which would be “driven by a significant number of new product introductions” likely to land in the second half of the year.</p><p>One of those new products is expected to be the <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-i-hope-to-see-on-the-garmin-fenix-9-including-the-return-of-a-smaller-size">Garmin Fenix 9</a>. Garmin’s flagship watch is refreshed each year and will probably be the most eye-catching launch to come this year.</p><p>However, I’m just as excited by the idea of a successor to the <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-enduro-3-review">Garmin Enduro 3</a>. This is another adventure watch that sits in Garmin’s outdoor division, and since the Enduro 3 came out in 2024, the line is due for an update this year.</p><p>While the Fenix line has long been the <a href="https://www.tomsguide.com/best-picks/best-garmin-watch">best Garmin watch</a> for adventurous athletes who spend a lot of time in the wilderness, there are a couple of reasons I think the Enduro 4 might be the watch to beat in this area by the end of 2026.</p><h3 class="article-body__section" id="section-the-enduro-has-the-battery-life-to-beat"><span>The Enduro has the battery life to beat</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:1749px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="eB5ZGxxR3temeVzG7Nm7D9" name="TG_Garmin-Enduro-3-4.jpg" alt="Garmin Enduro 3 watch" src="https://cdn.mos.cms.futurecdn.net/v2/t:54,l:176,cw:1749,ch:984,q:80/eB5ZGxxR3temeVzG7Nm7D9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nick Harris-Fry/Future)</span></figcaption></figure><p>Across the Garmin line-up, battery life is generally getting shorter with the brand’s latest models, as brighter and brighter AMOLED displays become the norm.</p><p>For the most part, I’m not against this move myself — I can charge my watch easily most days, Garmins still last way longer than smartwatches, and I like a bright display.</p><p>However, when it comes to spending days or weeks in the great outdoors, you want a long-lasting watch, and the Enduro is the best Garmin option on this front.</p><p>The Enduro 3 lasted me around 18 days on a charge even with heavy use, running every day, and it can last up to 90 days in sunny conditions thanks to its solar panels and power-saving memory-in-pixel display.</p><div class="product"><a data-dimension112="0da39338-7e94-11f1-aa13-5dabe25c6dd4" data-action="Deal Block" data-label="The Garmin Enduro 3 is a titanium adventure watch that offers outstanding battery life, partly thanks to the solar panels on its display. It's a great alternative to the Fenix 8 Pro for those who prefer a MIP display to AMOLED." data-dimension48="The Garmin Enduro 3 is a titanium adventure watch that offers outstanding battery life, partly thanks to the solar panels on its display. It's a great alternative to the Fenix 8 Pro for those who prefer a MIP display to AMOLED." data-dimension25="$881" href="https://www.amazon.com/Garmin-EnduroTM-Ultraperformance-Smartwatch-Built/dp/B0DD5N9G17" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="uGbzDcpqXkPkGxgwscFqN8" name="image" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uGbzDcpqXkPkGxgwscFqN8.png" mos="" align="middle" fullscreen="" width="900" height="900" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Garmin Enduro 3 is a titanium adventure watch that offers outstanding battery life, partly thanks to the solar panels on its display. It's a great alternative to the Fenix 8 Pro for those who prefer a MIP display to AMOLED.<a class="view-deal button" href="https://www.amazon.com/Garmin-EnduroTM-Ultraperformance-Smartwatch-Built/dp/B0DD5N9G17" target="_blank" rel="nofollow" data-dimension112="0da39338-7e94-11f1-aa13-5dabe25c6dd4" data-action="Deal Block" data-label="The Garmin Enduro 3 is a titanium adventure watch that offers outstanding battery life, partly thanks to the solar panels on its display. It's a great alternative to the Fenix 8 Pro for those who prefer a MIP display to AMOLED." data-dimension48="The Garmin Enduro 3 is a titanium adventure watch that offers outstanding battery life, partly thanks to the solar panels on its display. It's a great alternative to the Fenix 8 Pro for those who prefer a MIP display to AMOLED." data-dimension25="$881">View Deal</a></p></div><p>In contrast, the 47mm<a href="https://www.tomsguide.com/wellness/smartwatches/garmin-fenix-8-pro-review-the-greatest-fenix-yet"> Garmin Fenix 8 Pro</a> AMOLED lasts me more like four or five days with similar use, and even the 51mm watch can last a maximum of 27 days, or 15 days if the screen is always-on.</p><p>If the Garmin Enduro 4 can maintain the long battery life of its predecessor, or even exceed it, it’s almost certain to outlast the forthcoming Fenix 9.</p><h3 class="article-body__section" id="section-garmin-s-satellite-connectivity-could-come-to-the-enduro-4"><span>Garmin’s satellite connectivity could come to the Enduro 4</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jm3caidTdxsZxTfo2E76Va" name="Garmin Fenix 8 Pro" alt="Garmin Fenix 8 Pro" src="https://cdn.mos.cms.futurecdn.net/jm3caidTdxsZxTfo2E76Va.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The biggest update Garmin brought to the Fenix 8 Pro compared with the Fenix 8 was LTE and satellite connectivity, which allows you to stay in touch even when you're without your phone or when you're off the grid entirely.</p><p>This feature is likely to start spreading to other Garmin watches in the coming years, and the obvious place to start would be the adventure-focused Enduro line.</p><p>It’s a watch built to handle long expeditions in the wilderness, so satellite connectivity to send SOS messages and the like would be a natural addition to the Enduro 4.</p><h3 class="article-body__section" id="section-mip-fans-might-only-have-the-enduro-option"><span>MIP fans might only have the Enduro option</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="WJKVx6ogffCUtmbgkEZ5N9" name="TG_Garmin-Enduro-3-6.jpg" alt="Garmin Enduro 3 watch" src="https://cdn.mos.cms.futurecdn.net/WJKVx6ogffCUtmbgkEZ5N9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nick Harris-Fry/Future)</span></figcaption></figure><p>The Garmin Fenix 8 was the first Fenix to offer both MIP and AMOLED options — previously the AMOLED watches fell under the Epix barrier.</p><p>However, the Garmin Fenix 8 Pro series dropped the MIP option and added an innovative <a href="https://www.tomsguide.com/wellness/smartwatches/i-tried-garmins-usd2k-microled-smartwatch-and-the-display-was-even-better-than-i-expected">Fenix 8 Pro MicroLED</a> to the lineup.</p><p>This MicroLED tech is very impressive, but MIP watches still have a dedicated fanbase that loves the long battery life they offer when always-on, and their excellent visibility in bright sunlight.</p><p>There’s no guarantee the Fenix 9 series will have a MIP option, so the Enduro 4 could become the go-to option for those who want a top Garmin with this display.</p><p>It’s notable that thus far it’s only MIP Garmins that have offered solar panels on the face, which extends the battery life even further, so that could be another plus to the Enduro 4.</p><p>Of course, Garmin could choose to make the Enduro 4 an AMOLED watch as well — there are some incredibly long-lasting AMOLED watches now, like the <a href="https://www.tomsguide.com/wellness/smartwatches/i-swapped-my-garmin-fenix-8-pro-for-the-suunto-vertical-2-heres-5-things-i-liked-and-5-i-disliked">Suunto Vertical 2</a> — but that would bring it too close to the Fenix line in my opinion.</p><h3 class="article-body__section" id="section-the-enduro-is-now-cheaper-than-the-fenix"><span>The Enduro is now cheaper than the Fenix</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="GeWQDYtuVywmuyTKhEMJ69" name="TG_Garmin-Enduro-3-3.jpg" alt="Garmin Enduro 3 watch" src="https://cdn.mos.cms.futurecdn.net/GeWQDYtuVywmuyTKhEMJ69.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nick Harris-Fry/Future)</span></figcaption></figure><p>The Enduro line was initially more expensive than the Fenix line, but the Enduro 3 was cheaper than the Enduro 2 and fell well below the prices of the Fenix 8 and Fenix 8 Pro.</p><p>Given it’s a titanium watch with a sapphire display and most of Garmin’s top features, including offline maps, it was a bit of a bargain for those who didn’t want an AMOLED display.</p><p>If this price hierarchy continues with any new models launched in 2026, the new Enduro could offer better value to people seeking a resilient, long-lasting adventure watch.</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/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free">Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Apple Watch Ultra 4 — these are the upgrades Apple needs to make to remain the smartwatch king ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-these-are-the-upgrades-apple-needs-to-make-to-remain-the-smartwatch-king</link>
                                                                            <description>
                            <![CDATA[ From physical upgrades to battery life improvements to new AI features, here are the five biggest Apple Watch Ultra 4 upgrades I’m hoping for. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DrHp2Sbp8bPqvCqQqK2scW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bRghiFkByGRUquDJ57AHc9-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Jul 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/bRghiFkByGRUquDJ57AHc9-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Apple Watch Ultra 3 in silver]]></media:description>                                                            <media:text><![CDATA[Close-up of the Apple Watch Ultra 3 in silver]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Apple Watch Ultra 3 in silver]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bRghiFkByGRUquDJ57AHc9-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Apple Watch Ultra 3 is one of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> you can buy. And even though it’s less than a year old, <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Apple Watch Ultra 4 rumors</a> are plentiful; some even hint at a fall 2026 release.</p><p>I test a lot of wearables here at Tom’s Guide, and the Apple Watch Ultra 3 is easily my favorite rugged, full-featured smartwatch; I’d also argue that it’s the most advanced smartwatch on the market today. However, that doesn’t mean it’s perfect.</p><p>From physical upgrades to battery life improvements to new AI features, here are the five biggest Apple Watch Ultra 4 upgrades I’m hoping for. </p><h3 class="article-body__section" id="section-1-a-brighter-display"><span>1. A brighter 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:3512px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="FxDu65qwVcQLGbuBjuTeSA" name="AWU3-v-series11-03" alt="Close-up of the Apple Watch Ultra 3 in silver" src="https://cdn.mos.cms.futurecdn.net/FxDu65qwVcQLGbuBjuTeSA.jpg" mos="" align="middle" fullscreen="" width="3512" height="1976" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Without an increase in screen brightness, Apple risks falling behind the competition, namely, Samsung, Google, and Garmin. The Apple Watch Ultra 3 maxes out at 3,000 nits, the same brightness as the <a href="https://www.tomsguide.com/reviews/apple-watch-ultra-2">Apple Watch Ultra 2</a>. This is bright enough to see in direct sunlight, in most cases, but not nearly as bright as the <a href="https://www.tomsguide.com/wellness/smartwatches/i-tried-garmins-usd2k-microled-smartwatch-and-the-display-was-even-better-than-i-expected">Garmin Fenix 8 Pro LED</a>, which goes up to 4,500 nits.</p><p>The <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-went-hands-on-with-google-pixel-watch-4-and-it-could-be-my-new-favorite-smartwatch-for-android">Google Pixel Watch 4</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Samsung Galaxy Watch 8</a>, both significantly cheaper than the Apple Watch Ultra 3, also boast 3,000-nit max brightness, and there’s a good shot that the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-9-and-ultra-2-rumors-everything-weve-heard-so-far">Galaxy Watch 9</a> and/or <a href="https://www.tomsguide.com/wellness/smartwatches/google-pixel-watch-5-rumors-everything-we-know-so-far">Pixel Watch 5</a> will push that spec another 1,000 nits.</p><p>So, without an equal or greater bump in display output, the Apple Watch Ultra 4 risks feeling dated on arrival. </p><h3 class="article-body__section" id="section-2-a-thinner-lighter-case"><span>2. A thinner, lighter case</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:1618px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="aseStUyDHqcDFGWJKwJRgC" name="AppleWatchUltra3-02" alt="Apple Watch Ultra 3" src="https://cdn.mos.cms.futurecdn.net/aseStUyDHqcDFGWJKwJRgC.jpg" mos="" align="middle" fullscreen="" width="1618" height="910" attribution="" endorsement="" 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 Apple Watch Ultra 3 case is reasonably lightweight and thin, but I think Apple can go even slimmer. The Apple Watch Ultra 3 already wears way more comfortably than the <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Samsung Galaxy Watch Ultra</a>, its Android-friendly equivalent, but <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-rumors-heres-everything-we-expect-from-samsungs-next-gen-rugged-smartwatch">Galaxy Watch Ultra 2 rumors</a> hint that a slimmer case might be in the cards.</p><p>To keep the competitive advantage of a comfier design, I’d love to see the Apple Watch Ultra 3 boast a thickness under 10 mm (a reduction of ~2 mm). Given that the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch Series 11</a> is 9.7 mm, I have no doubt that the fine folks in Cupertino can get this done. </p><h3 class="article-body__section" id="section-3-three-days-of-battery-or-more"><span>3. Three days of battery (or more)</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:2641px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="LJrw2jH4amRDyThhoTcAnV" name="IMG_4770 copy" alt="apple watch ultra 3 low power mode" src="https://cdn.mos.cms.futurecdn.net/LJrw2jH4amRDyThhoTcAnV.jpg" mos="" align="middle" fullscreen="" width="2641" height="1485" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Battery life is arguably Apple’s Achilles heel when it comes to wearables, and even though the Ultra 3 is Apple’s longest-lasting smartwatch, battery life is only good for about 42 hours per charge without power-saving options enabled. </p><p>By comparison, the Galaxy Watch Ultra lasts for closer to 48 hours. Meanwhile, the <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-went-hands-on-with-google-pixel-watch-4-and-it-could-be-my-new-favorite-smartwatch-for-android">Google Pixel Watch 4</a> in 45mm, though not a “rugged-style” smartwatch, is good for about two days per charge. Moreover, I suspect the successors to both models will see a battery life bump.</p><p>This is all to say, Apple has its work cut out when it comes to power consumption in the Watch Ultra 4.</p><h3 class="article-body__section" id="section-4-an-easier-way-to-unlock-the-screen"><span>4. An easier way to unlock the screen</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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="peVp4bbQbxfsrq4tSG6XaS" name="Apple Watch Ultra 3 Pride Luminance Face" alt="Apple Watch Ultra 3 Pride Luminance Face" src="https://cdn.mos.cms.futurecdn.net/peVp4bbQbxfsrq4tSG6XaS.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Passcodes never seemed like a great way to unlock an Apple Watch, which is why two separate <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch 12</a>/Ultra 4 rumors have me excited. One suggests that Apple's next-gen smartwatches will get forward-facing cameras for Face ID. The other hints that an under-the-display fingerprint scanner could make an appearance.</p><p>Either of these methods would be a welcome change to punching in a code every time you want to use your Apple Watch, though I ultimately think that Face ID is the better option of the two. </p><h3 class="article-body__section" id="section-5-siri-ai-assistant"><span>5. Siri AI assistant </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="6xWxFmJRkMDPWa7YQ7zZ33" name="IMG_5005" alt="A photo of the Apple Watch Ultra 3" src="https://cdn.mos.cms.futurecdn.net/6xWxFmJRkMDPWa7YQ7zZ33.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>Last but not least, the Apple Watch Ultra 4 needs to debut with a ready-to-use, no-excuses version of Siri AI that’s on par with or better than Google’s implementation of Gemini AI as a virtual assistant on the latest Pixel Watch and Galaxy Watch models.</p><p>This not only means a Siri AI capable of answering complex, context-specific questions with ease, but also one that can be unlocked with a simple gesture control, similar to the Pixel Watch 4’s ‘raise wrist” gesture. </p><p>What upgrades or new features do you want to see come to the Apple Watch Ultra 4? Let me know below. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBzBKe"></div>                            </div>                            <script src="https://kwizly.com/embed/eBzBKe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3">Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Watch Ultra 2 needs these 3 upgrades to convince me to switch from my Apple Watch Ultra 3 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-needs-these-3-upgrades-to-convince-me-to-switch-from-my-apple-watch-ultra-3</link>
                                                                            <description>
                            <![CDATA[ Here are the three biggest upgrades that would make me swap out of Apple Watch Ultra 3 for the rumored Samsung Galaxy Watch Ultra 2. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4WcyjyY4gKS95EAR3Lf3Z</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/aS6NZwoXuvuWsSuTXsi4X9-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 14 Jul 2026 12:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/aS6NZwoXuvuWsSuTXsi4X9-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Apple Watch Ultra 3 next to the Samsung Galaxy Watch Ultra in the writer&#039;s hand against a colorful background]]></media:description>                                                            <media:text><![CDATA[Close-up of the Apple Watch Ultra 3 next to the Samsung Galaxy Watch Ultra in the writer&#039;s hand against a colorful background]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Apple Watch Ultra 3 next to the Samsung Galaxy Watch Ultra in the writer&#039;s hand against a colorful background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/aS6NZwoXuvuWsSuTXsi4X9-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung’s answer to the Apple Watch Ultra series, the uniquely named Galaxy Watch Ultra, debuted almost two years ago exactly, and if recent <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-rumors-heres-everything-we-expect-from-samsungs-next-gen-rugged-smartwatch">Galaxy Watch Ultra 2 rumors</a> prove to be true, we should get our first look at its successor in just a few weeks; Samsung has a Galaxy Unpacked event scheduled for July 22nd. </p><p>The original <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Galaxy Watch Ultra</a> remains one of the <a href="https://www.tomsguide.com/best-picks/best-smartwatches-android">best smartwatches for Android</a> users in 2026. It’s the leader of the pack in display size, battery life, and durability, but there is room for improvement.</p><p>I’ve tested both the Galaxy Watch Ultra and<a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review"> Apple Watch Ultra 3</a> extensively, including in a head-to-head <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-vs-samsung-galaxy-watch-ultra-i-walked-6-500-steps-and-it-was-almost-too-close-to-call">fitness-tracking showdown</a>. OS and holistic tech aside, I prefer the design of the Apple Watch Ultra 3 to the Galaxy Watch Ultra for several key reasons. </p><p>With that in mind, here are three improvements that would make the Samsung Galaxy Watch Ultra 2 more competitive against — and even beat — the Apple Watch Ultra 3. </p><h3 class="article-body__section" id="section-1-slim-down-the-case-size"><span>1. Slim down the case size </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:3698px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T9NUAcVH7WQNoiLcde2jFF" name="GalaxyWatchUltra-02" alt="Back of the Samsung Galaxy Watch Ultra showing the health sensor array" src="https://cdn.mos.cms.futurecdn.net/T9NUAcVH7WQNoiLcde2jFF.jpg" mos="" align="middle" fullscreen="" width="3698" height="2080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy Watch Ultra is one chunky smartwatch. While the specs would lead you to believe it’s essentially the same thickness as the Apple Watch Ultra 3 (~12 mm), that official measurement isn’t telling the whole story.</p><p>Sure, the Galaxy Watch Ultra is about 12 mm thick at the very edge of the case; I just measured it using a caliper. However, at the center of the case, where the sensor array protrudes, the Galaxy Watch Ultra is closer to 16 mm thick. The Apple Watch Ultra 3, meanwhile, measures a little over 14 mm thick at the center of the case.</p><p>Both watches weigh about the same, but the Galaxy Watch Ultra wears significantly larger on my 6.5-inch wrist.  This is not only due to the extra ~2 mm of thickness but also to its square case shape, which makes it roughly 3 mm wider than the Ultra 3. That said, the Apple is a little taller.</p><p>Ultimately, a slimmer, narrower case design would go a long way toward convincing me to consider the Galaxy Watch Ultra 2 over the Apple Watch Ultra 3; shave off a little weight, and I’m even more sold. </p><h3 class="article-body__section" id="section-2-bump-up-battery-life-to-three-days-or-more"><span>2. Bump up battery life to three days or more</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:1278px;"><p class="vanilla-image-block" style="padding-top:56.18%;"><img id="FsCoTmZ6WXwagLctb8znFJ" name="Screenshot 2024-07-29 at 5.25.21 PM Cropped.png" alt="Samsung Galaxy Watch Ultra" src="https://cdn.mos.cms.futurecdn.net/FsCoTmZ6WXwagLctb8znFJ.png" mos="" align="middle" fullscreen="" width="1278" height="718" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In full smartwatch mode (i.e., with no battery-saving options enabled), the Galaxy Watch Ultra lasts roughly two days per charge in our testing. The Apple Watch Ultra 3, on the other hand, lasts about 42 hours per charge, on average, just under the two-day mark.</p><p>For the Galaxy Watch Ultra 2, Samsung would be wise to double down on its battery life advantage and push the advertised rating to three days or more per charge. After all, <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Apple Watch Ultra 4 rumors </a>also hint at a potential battery life bump, though we don't know for certain if such a model will debut this fall or not.</p><h3 class="article-body__section" id="section-3-improve-water-resistance-for-diving"><span>3. Improve water resistance for diving </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:3760px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EQo7KbwcrzbkBMvo3wVMUY" name="AWU3-GalaxyU-04" alt="Close-up of the Apple Watch Ultra 3 next to the Samsung Galaxy Watch Ultra in the writer's hand against a colorful background" src="https://cdn.mos.cms.futurecdn.net/EQo7KbwcrzbkBMvo3wVMUY.jpg" mos="" align="middle" fullscreen="" width="3760" height="2115" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Whether you’re a hardcore watersport enthusiast or not, the fact that the Apple Watch Ultra 3 is rated for scuba diving, with all sorts of tools to boot, definitely gives users some unique bragging rights.</p><p>Sadly, despite having the same 100-meter water-resistance rating, the Samsung Galaxy Watch Ultra is explicitly not designed for <a href="https://www.samsung.com/ae/support/mobile-devices/does-the-galaxy-watch-ultra-support-water-and-dust-resistance/">extended underwater use</a>. This means deep-sea diving and even snorkeling are out of the question.</p><p>It also means that high-impact water sports, like water skiing or riding jet skis, are also ill-advised. Bummer! </p><p>There is, of course, only one way to correct course: Samsung needs the Galaxy Watch Ultra 2 to be fully dive-ready, water-resistance-wise, while also including a set of comprehensive dive-friendly tools equal to or better than Apple's.</p><p>What are your thoughts on the Samsung Galaxy Watch Ultra 2? Is there one feature or upgrade in particular you’re hoping for the most? Let me know in the poll or comments below. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwqKAX"></div>                            </div>                            <script src="https://kwizly.com/embed/WwqKAX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/3-apple-watch-settings-i-always-turn-off-to-maximize-battery-life">3 Apple Watch settings I always turn off to maximize battery life</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-apple-watch-11-vs-fitbit-air-and-theres-a-clear-winner">I manually counted 5,000 steps to test the Apple Watch 11 vs Fitbit Air, and Apple wins the accuracy battle while offering superior elevation data</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I got so much more out of my Apple Watch after turning on these 5 features — here's how to use them ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/i-got-so-much-more-out-of-my-apple-watch-after-turning-on-these-5-features</link>
                                                                            <description>
                            <![CDATA[ From a hidden web browser to a stealth camera shutter, these underrated Apple Watch features will change how you use your wearable. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">GLMjRQXZtTMvvZoB58TF6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rcT22Gcv5Z458Xr6vyb39b-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 12 Jul 2026 06:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ kaycee.hill@futurenet.com (Kaycee Hill) ]]></author>                    <dc:creator><![CDATA[ Kaycee Hill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/xHn6RmpEqg87cvtLwrBu9G.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rcT22Gcv5Z458Xr6vyb39b-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple Watch Series 8 - Tom&#039;s Guide Awards 2023: ]]></media:description>                                                            <media:text><![CDATA[Apple Watch Series 8 - Tom&#039;s Guide Awards 2023: ]]></media:text>
                                <media:title type="plain"><![CDATA[Apple Watch Series 8 - Tom&#039;s Guide Awards 2023: ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rcT22Gcv5Z458Xr6vyb39b-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Most people buy an Apple Watch for two reasons: tracking exercise and checking notifications. But if that’s all you’re using it for, you’re only scratching the surface of what’s on your wrist. </p><p>Beneath the standard watchOS interface lies a powerhouse of hidden tools designed to save you time, streamline your daily routines, and even protect your peace of mind. </p><p>Here are five deeply underrated Apple Watch features that will fundamentally change how you use your wearable every single day.</p><section class="howto-block">                    <h3>1. Protect your hearing </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/d9whKAx9HdWnU4fcVJG8KD.jpg"                                        alt="Apple Watch Noise app"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/d9whKAx9HdWnU4fcVJG8KD.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>You probably don’t think about your hearing health until you’re at a deafening concert or using power tools. That’s where the Noise app comes in. It acts as a silent, background bodyguard for your ears, requiring zero daily effort after a one-time setup. </p><p>To turn it on, <strong>head to Settings on your watch, tap Noise, then select</strong> <strong>Environmental Sound Measurements to toggle on Measure Sounds</strong>. </p><p>Then go back to <strong>Noise Notifications and set your decibel threshold</strong> (80dB or 85dB is the sweet spot). Now, your watch will quietly monitor the room and give you a gentle tap if the environment gets dangerously loud.</p></p>                </section><section class="howto-block">                    <h3>2. Turn your wrist into a walkie talkie </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/XFPYYtuu56baJGNJYLkSf6.jpg"                                        alt="Apple watch walkie-talkie feature"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/XFPYYtuu56baJGNJYLkSf6.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>It’s easy to dismiss the Walkie-Talkie app as a gimmick until you actually use it. This feature lets you push-to-talk directly with another Apple Watch user in real time over Wi-Fi or cellular. </p><p>All you need to do is <strong>open the Walkie-Talkie app, send an invite to a contact, and wait for them to accept</strong>. Once they do, hold the talk button, speak, and your voice instantly plays out of their watch speaker. </p><p>If you can't find it, you may just need to head to Settings and Accessibility to make sure it's toggled on.</p></p>                </section><section class="howto-block">                    <h3>3. Check your heart </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="http://cdn.mos.cms.futurecdn.net/gcapBgE2qxcTitFvE3meGM.jpg"                                        alt="Apple Watch Series 4 ECG"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="http://cdn.mos.cms.futurecdn.net/gcapBgE2qxcTitFvE3meGM.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Tom's Guide)</div></figure>                    <p><p>Apple introduced the ECG (electrocardiogram) feature way back with the Series 4, yet a surprising number of people still don't know about it. This tool on your wrist is capable of detecting irregular heart rhythms like atrial fibrillation. </p><p>To use it,<strong> sit comfortably, rest your arm on a table, open the ECG app, and hold your index finger against the Digital Crown for 30 seconds</strong>. Your watch handles the rest, giving you a clear reading you can log, add symptoms to, and instantly export as a PDF to share with your doctor if something feels off.</p></p>                </section><section class="howto-block">                    <h3>4. Browse the web </h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/PqLv8XEWBWb8Kf4pMfoHzS.jpg"                                        alt="Apple Watch hidden Safari browser."                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/PqLv8XEWBWb8Kf4pMfoHzS.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>Apple famously left Safari off the Apple Watch, but the browser engine is actually hidden right inside the software. If you ever need to quickly look something up without pulling out your phone, you can force the watch to surf the web. </p><p><strong>Just open the Messages app, start a text to yourself, type in a full URL (like google.com), and hit send</strong>. When you tap the link in the text thread, a fully functional web browser pops up on your wrist. </p><p>If a page looks strange, just tap the top URL bar to toggle between Reader View and standard Web View.</p></p>                </section><section class="howto-block">                    <h3>5. Snap a photo with a double-tap of your fingers</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/KDtPAfgMnei3c5kh5LFD9P.jpg"                                        alt="Close-up of the Apple Watch Ultra 3's best secret features"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/KDtPAfgMnei3c5kh5LFD9P.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Dan Bracaglia/Tom's Guide)</div></figure>                    <p><p>Trying to prop up your iPhone for a group photo usually involves a frantic 10-second sprint after hitting the timer. Instead, you can use the Double Tap gesture to control your camera completely hands-free. </p><p>While the double-tap gesture handles plenty of different tasks across watchOS, its best use case is acting as a stealthy remote shutter. <strong>Just prop up your phone, open the Camera Remote app</strong> on your watch to frame the shot, and<strong> casually pinch your thumb and index finger together twice</strong>. </p><p>Your watch instantly triggers the shutter, letting you take the perfect shot without anyone realizing you're controlling the camera.</p></p>                </section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide </span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/how-to-use-apple-watch-hypertension-alerts-the-feature-that-detects-what-you-cant-feel">How to use Apple Watch hypertension alerts — the life-saving feature you need to turn on</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/get-more-from-your-apple-watch-5-hidden-control-center-features-worth-knowing">Get more from your Apple Watch — hidden Control Center features worth knowing</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/5-hidden-settings-that-extend-your-apple-watchs-battery-life">5 hidden settings that extend your Apple Watch's battery life</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ It's time for a Fitbit Ring — 3 reasons why Google should make an Oura Ring alternative ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/3-reasons-why-google-should-make-an-oura-ring-alternative</link>
                                                                            <description>
                            <![CDATA[ Piggybacking off the success of the Fitbit Air, Google should deliver a Fitbit Ring next to take on the Oura Ring and Galaxy Ring. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bBvqAuSqc2YWM69E97MmuV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yEyuWoGUWVhXkiNLsfhTeR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 12 Jul 2026 04:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/yEyuWoGUWVhXkiNLsfhTeR-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Fitbit Air and Oura Ring 4 Ceramic  against a blue background]]></media:description>                                                            <media:text><![CDATA[Close-up of the Fitbit Air and Oura Ring 4 Ceramic  against a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Fitbit Air and Oura Ring 4 Ceramic  against a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yEyuWoGUWVhXkiNLsfhTeR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Google should capitalize on the recent success of the screen-free <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> fitness tracker and launch a Fitbit-branded smart ring to take on the <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring 5</a>, <a href="https://www.tomsguide.com/wellness/fitness-trackers/samsung-galaxy-ring-review">Samsung Galaxy Ring</a>, and other major players in the space.</p><p>I review wearable tech for a living, and Google has never been in a more prime position to debut a finger-based holistic wearable to rival the best smart ring out there. Here are the three biggest reasons why.</p><h3 class="article-body__section" id="section-1-screen-free-wearables-are-having-a-moment"><span>1. Screen-free wearables are having a moment </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:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="U7CsKAzYLXvVM9EZdDe48E" name="Fitbit-Ring-02" alt="Close-up of the Fitbit Air and Oura Ring 4 Ceramic in the writer's hand against a blue background" src="https://cdn.mos.cms.futurecdn.net/U7CsKAzYLXvVM9EZdDe48E.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The <a href="https://www.amazon.com/dp/B0GTMJF7PV" target="_blank" rel="nofollow">$99 Fitbit Air</a> debuted just a few months ago to mostly positive reviews, including from me; I even picked it as one of the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a> in 2026. Not only that, I’m wearing one as I type this. <em><strong>That’s </strong></em>how much I dig Google’s latest tracker.</p><p>Moreover, Fitbit isn’t the only major tech brand doubling down on screenless wearables. Oura just refreshed its flagship model with the <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring 5</a>; Garmin is rumored to be imminently launching a Fitbit Air alternative, potentially called the <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-wishlist-3-ways-garmins-rumored-screen-free-tracker-can-beat-the-fitbit-air">Garmin Cirqa</a>; and the <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a> remains a super-popular tracker for hardcore and pro athletes.</p><p>IMHO, Google should take everything that makes the Fitbit Air great — the affordable price, comfortable design, solid battery life, easy-to-digest holistic insights, etc. — and reconfigure it into a smart ring. </p><p>The Fitbit Air already significantly undercuts the competition, Whoop, by a massive margin in terms of cost (an annual Whoop membership starts at $199). A Fitbit smart ring could potentially do the same versus Oura (the Oura Ring 5 starts at $499).</p><h3 class="article-body__section" id="section-2-google-wearables-are-already-subscription-optional-unlike-the-oura-ring"><span>2. Google wearables are already subscription-optional, unlike the Oura Ring</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="m58aY2hFFy6FdCrzDEoo69" name="Oura vs Whoop vs Fitbit Air" alt="a photo of Oura Ring 5, Fitbit Air, Whoop MG" src="https://cdn.mos.cms.futurecdn.net/m58aY2hFFy6FdCrzDEoo69.jpg" mos="" align="middle" fullscreen="" width="3000" height="1688" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Another major advantage Google has over both Oura and Whoop is a subscription-optional approach to health and fitness tracking. Take the Fitbit Air, for example: $99 gets you the device and access to all the tracker’s core holistic data via the <a href="https://www.tomsguide.com/wellness/fitness/the-fitbit-app-is-officially-dead-but-dont-panic-its-replacement-is-even-better">Google Health app</a> for no additional charge.</p><p>Want next-level AI-backed insights? Google Health Premium is optional at $9.99 per month or $99 per year. The premium service also includes access to “<a href="https://www.tomsguide.com/wellness/fitness/i-spent-20-minutes-chatting-with-fitbits-new-ai-fitness-coach-5-things-that-surprised-me">The Coach</a>,” Google’s personalized AI trainer. Not sure if these insights/tools are right for you? Most Google wearables come with a free Premium subscription demo to try before you buy.</p><h3 class="article-body__section" id="section-3-fitbits-work-with-android-and-ios-unlike-the-galaxy-ring"><span>3. Fitbits work with Android and iOS, unlike the Galaxy Ring  </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:5372px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AVgujupoK8pSc4tZSVSk3E" name="Fitbit-Ring-01" alt="Close-up of the Fitbit Air and Oura Ring 4 Ceramic in the writer's hand against a blue background" src="https://cdn.mos.cms.futurecdn.net/AVgujupoK8pSc4tZSVSk3E.jpg" mos="" align="middle" fullscreen="" width="5372" height="3022" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>This one applies less to the Oura Ring, which plays nicely with both Android and iOS devices. However, the <a href="https://www.tomsguide.com/wellness/fitness-trackers/samsung-galaxy-ring-review">Samsung Galaxy Ring</a> — which is arguably the next-<a href="https://www.tomsguide.com/wellness/fitness-trackers/best-smart-rings">best smart ring</a> to anything named Oura — is Android-only.</p><p>The fact that Fitbit wearables also work with both operating systems — and presumably, a Fitbit Ring would too — gives Google a potentially major advantage over Samsung in terms of acquiring new customers. </p><p>Then again, recent rumors suggest that a <a href="https://www.tomsguide.com/wellness/smart-rings/samsung-confirms-galaxy-ring-2-is-coming-and-it-might-even-work-with-ios">Samsung Galaxy Ring 2</a> is in the works, and that iPhone compatibility isn’t out of the question. That said, a refresh of the Galaxy Ring in 2026 seems unlikely, which is all the more reason for Google to roll out a Fitbit Ring sooner rather than later.</p><p>What do you think? Would you be interested in a Google/Fitbit Ring? Let me know in our poll below.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XZKV8e"></div>                            </div>                            <script src="https://kwizly.com/embed/XZKV8e.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free">Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-apple-watch-11-vs-fitbit-air-and-theres-a-clear-winner">I manually counted 5,000 steps to test the Apple Watch 11 vs Fitbit Air, and Apple wins the accuracy battle while offering superior elevation data</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested Withings' ScanWatch 2 and while its breathing exercises help fix 3 a.m. stress wake-ups, there are better sleep trackers for the money ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/sleep-tech/withings-scanwatch-2-review</link>
                                                                            <description>
                            <![CDATA[ The Withings ScanWatch 2 is a hybrid smartwatch that packs impressive sleep tracking tech into a stylish package. But is it a case of form over function? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HACxcet8e3D8hQmzTuResY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GcjTKNtmpxgE5LzyHnfcbW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 11 Jul 2026 08:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Sleep Tech]]></category>
                                                    <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Sleep]]></category>
                                                                                                <author><![CDATA[ ruth.jones@futurenet.com (Ruth Jones) ]]></author>                    <dc:creator><![CDATA[ Ruth Jones ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/Cqbswyyro7aBYnvMKaoS6W.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/GcjTKNtmpxgE5LzyHnfcbW-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The WithingsScanWatch 2 on a table against a white wall]]></media:description>                                                            <media:text><![CDATA[The WithingsScanWatch 2 on a table against a white wall]]></media:text>
                                <media:title type="plain"><![CDATA[The WithingsScanWatch 2 on a table against a white wall]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GcjTKNtmpxgE5LzyHnfcbW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <h3 class="article-body__section" id="section-withings-scanwatch-2-review-in-brief"><span>Withings ScanWatch 2: Review in brief</span></h3><p>Despite my love of <a href="https://www.tomsguide.com/wellness/sleep-tech/5-gadgets-i-recommend-for-better-sleep">sleep tech</a>, I used to think the only way you'd get me in a <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">smartwatch</a> was by tearing my beloved analog watch from my cold, dead wrist. The Withings ScanWatch 2 has proven me wrong, showing there is an option for those who want functional health tracking in more attractive packaging than a black screen.</p><p>The Withings ScanWatch 2 looks like your conventional watch but packed inside is a wealth of health and fitness tech. From sleep tracking to step counters to SpO2 measures, the ScanWatch 2 features advanced tech designed to give you a well-rounded view of your health.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VhgF8hdwrsab4AbN2TdfS" name="Withings ScanWatch 2 breathe" alt="A close up of the Withings Scan Watch 2 on our reviewer's wrist with the display showing the breathe function" src="https://cdn.mos.cms.futurecdn.net/VhgF8hdwrsab4AbN2TdfS.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Overall, the health and sleep data is comparable to the <a href="https://www.tomsguide.com/wellness/sleep-tech/best-sleep-tracker">best sleep trackers</a> (although I found the <a href="https://www.tomsguide.com/wellness/sleep-tech/withings-sleep-analyzer-review">Withings Sleep Mat</a> comes out on top for sleep metrics), and the Withings app makes it easy to understand. You do have to upgrade to Withings+, however, if you want advice on what to do with that data.</p><p>To maintain the analog look, the ScanWatch2 does have to make some sacrifices. The paired down display means you have to use the app for detailed insight and scrolling through the small dial can be frustrating. It’s also one of the bulkier health trackers, which makes it less comfortable for sleep (and quite warm to wear).</p><p>But this is a smartwatch for people who don’t want to wear a smartwatch and although the display might be simplified compared to say, the Apple Watch 11, the data and the tech isn’t.</p><h3 class="article-body__section" id="section-withings-scanwatch-2-price"><span>Withings ScanWatch 2: Price</span></h3><p>The <a href="https://www.withings.com/us/en/scanwatch-2" target="_blank">WithingsScan Watch 2 starts at $369.95 US / £319.99 UK at Withings</a>. A standard wristband is included, but you can add additional wristbands (including a metal buckle design) from $35.95 / £35.95. </p><p>That places it among premium fitness trackers, such as the Apple Watch 11 (<a href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminum-Always/dp/B0FQFL8PZ5/" target="_blank">from $399.99 / £369.99 at Amazon</a>) or the Oura Ring 5 (<a href="https://ouraring.com/store/rings/oura-ring-5/silver" target="_blank">from $399 / £399 at Oura</a>). Withings does offer a more affordable alternative in the ScanWatch Light (<a href="https://www.withings.com/us/en/scanwatch-light" target="_blank">$249.95 / £319.95</a>) or, if it’s just sleep tracking you want, the Withings Sleep Mat is <a href="https://www.withings.com/us/en/sleep" target="_blank">$199.95 / £129.95</a>.</p><p>I tested the Withings ScanWatch 2 using the basic free tier but you can upgrade to the Withings+ subscription. One month comes free and after that it's either $9.95 / £8.95 per month, or $99.50 / £89.50 a year.</p><h3 class="article-body__section" id="section-withings-scanwatch-2-design-and-comfort"><span>Withings ScanWatch 2: Design and Comfort</span></h3><p>I’m a diehard analog watch lover and so the hybrid design of the Withings ScanWatch 2 appeals exactly to my taste. It looks like an analog watch until you get close and discover the double dials are hiding a health tracker and a step counter. </p><p>The upper dial is the digital display and it's here you'll find your health tracking data (and any notifications). It's easy to see both in daylight and the dark. The crown on the bezel is used not to change the time (that happens automatically automatically) but to scroll through the menu. The lower dial tracks your fitness goal, such as how close you are to 10,000 steps.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QaNMMzCkACLCE8FgiUWPnJ" name="Withings ScanWatch 2 pressing button" alt="A Closeup of the Withings ScanWatch 2 with a hand pressing the crown to turn the screen on" src="https://cdn.mos.cms.futurecdn.net/QaNMMzCkACLCE8FgiUWPnJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Made from Sapphire glass and a stainless steel case with an FKM (fluoroelastomer), the ScanWatch 2 feels durable (and perhaps a little bulky — I'll get into that now). It's also swimproof.</p><p>The disadvantage of this hybrid design is that the ScanWatch is cumbersome in comparison to lightweight trackers such as the FitBit Air. It's particularly notable when sleeping — I wear my watch on my left wrist which is the side I gravitate towards in sleep. As a result, it often takes some readjustment to ensure my watch isn’t pressing into me. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/GSCwuoVNASPtcgJGCtyVSb.jpg" alt="A close up of the back of the Withings ScanWatch 2, where the health and sleep sensors are located" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jQpmZ8FGMCv2aLjVvoMN5k.jpg" alt="A closeup of the Withings ScanWatch 2 on our reviewer's wrist" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>However, it’s not much bulkier than the Apple Watch 11 or the Garmin Forerunner, which both prioritize plenty of tech over a streamlined design.</p><p>There's also less data available on the screen, although that does mean it's less distracting than other smartwatches. It's a matter of preference; if you want a traditional look with at-a-glance data, the ScanWatch 2 has you covered.</p><h3 class="article-body__section" id="section-withings-scanwatch-2-sleep-tracking"><span>Withings ScanWatch 2: Sleep tracking</span></h3><p>The Withings ScanWatch 2 tracks a variety of metrics to deliver a <a href="https://www.tomsguide.com/wellness/sleep/i-hit-a-sleep-score-of-100-last-weekend-heres-everything-i-did-to-sleep-better">sleep score</a> summing up your night. This includes duration (time in bed and time asleep), <a href="https://www.tomsguide.com/wellness/sleep/sleep-cycles">sleep stage</a>, heart rate, and <a href="https://www.tomsguide.com/wellness/sleep/experts-explain-what-hrv-on-your-sleep-tracker-means-and-how-to-improve-yours">HRV</a> (heart rate variability). </p><p>I compared the sleep metrics collected by my Withings ScanWatch to the data from my <a href="https://www.tomsguide.com/wellness/sleep-tech/the-muse-s-athena-headband-helps-me-fall-asleep-fast-even-when-im-wired-heres-why-its-the-best-sleep-aid-ive-tried-so-far-in-2026">Muse S Athena headband</a> and, bar a few minor differences in sleep and wake time, the results largely matched. My heart rate metrics are also comparable.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gBWsURykNMepa6fVeKYzy6" name="withings scanwatch 2 vs muse sleep" alt="On the left, sleep data from the Withings ScanWatch 2. On the right, sleep data from the Muse S Athena" src="https://cdn.mos.cms.futurecdn.net/gBWsURykNMepa6fVeKYzy6.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Withings | Muse)</span></figcaption></figure><p>However, the ScanWatch 2 has a tendency to miss minor interruptions, attributing them instead to <a href="https://www.tomsguide.com/wellness/sleep/light-sleep-is-just-as-important-as-deep-this-sleep-expert-explains-why">light sleep</a>. For example, in data from July 7th my Muse S Athena noted a wake up at 5.17 a.m., which my ScanWatch didn’t. I know for certain I was awake at this point because I checked the time... but I did fall asleep again quickly.</p><p>The ScanWatch can also confuse moments of stillness for sleep. (See my ‘nap’ at 7.40 a.m. which was definitely just me scrolling through my phone.) However, I’ve found it’s more accurate than Withings’s dedicated Sleep tracker for determining when I’m actively trying to sleep — the Withings Sleep Mat tends to mistake ‘<a href="https://www.tomsguide.com/wellness/sleep-tech/reading-in-bed-was-keeping-me-awake-but-this-usd16-gadget-helps-me-fall-asleep-before-i-can-even-finish-my-chapter">reading in bed</a>’ with ‘lying awake’.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cRnDE9WgczwirbqoCwVwXU" name="Withings scanwatch vs muse heart rate" alt="On the left, heart rate and sleep tracking data from the Withings ScanWatch 2. On the right, heart rate and sleep tracking from the Muse S Athena" src="https://cdn.mos.cms.futurecdn.net/cRnDE9WgczwirbqoCwVwXU.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Withings | Muse)</span></figcaption></figure><p>The ScanWatch 2 has a few more advantages over the Sleep Mat (also from Withings). For a start, it’s portable which means I can track consistently even when traveling. It also collects health data that’s not directly related to hours in bed but nonetheless influences your rest (such as temperature, activity levels, and <a href="https://www.tomsguide.com/wellness/sleep/menstrual-cycle-and-sleep">menstrual cycle</a>). </p><p>However, for accurate and detailed sleep tracking, both the Withings Sleep Mat and the Muse S Athena come out on top. The ScanWatch provides an excellent overview but can miss the finer details. Not to mention, the bulky design means that on some particularly restless nights, I've had to take it off around 3 a.m.</p><h3 class="article-body__section" id="section-withings-scanwatch-2-health-and-fitness-tracking"><span>Withings ScanWatch 2: Health and fitness tracking</span></h3><p>Despite the streamlined display and the analog design, the ScanWatch 2 is packed with some high tech health tracking features, including a step tracker, heart rate monitor and SpO2 tracker. A lot of this tech is accessible subscription free, which is a bonus for a health tracker (for example, much of Whoop’s tracking features are premium access).</p><p>I use it primarily to track my steps (I’m a walker), although you can also log swimming, running, cycling and ‘other’. I have the dial on the watch face set to log my steps as I go, with a vibration and notification when I hit 10,000. It’s a useful feature to stay on top of your fitness without having it glaring in your face (overall, the ScanWatch excels at subtlety).</p><p>In terms of accuracy, both the step counter and temperature tracker have impressed me with their accuracy, although some steps do appear to be overlooked (I count more steps quietly padding around my living room than the ScanWatch acknowledges). From this, I assume data such as SpO2 monitoring is accurate, although I don’t have clinical results to compare to.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rruhTacY2SU9YQVZzuf4b9" name="Withings ScanWatch 2 temperature tracking" alt="A close up of the Withings ScanWatch 2 on a wrist showing the temperature reading function" src="https://cdn.mos.cms.futurecdn.net/rruhTacY2SU9YQVZzuf4b9.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There’s two more additional features I’d like to call attention to. First, the ‘breathe’ app. This is displayed on the watch face and guides you through simple breathing exercises. I’ve found it useful both before bed and on-the-go. </p><p>Second, temperature tracking. Overnight temperature readings helped me see a clear link between warm weather and disrupted sleep (and it works with the menstrual tracking feature to predict periods). It's just a shame that the bulky design means on hot nights I tend to take the watch off midway through the night, because it's too stuffy.</p><p>While the ScanWatch has impressed me with its accuracy, for free users, it delivers little in the way of analysis — you need to upgrade to the Withings+ app for that.</p><h3 class="article-body__section" id="section-withings-scanwatch-2-performance"><span>Withings ScanWatch 2: Performance</span></h3><h2 id="set-up">Set up</h2><p>The ScanWatch 2 is incredibly easy to set up. Connecting to your phone via Bluetooth, you’re guided through the best way to wear the ScanWatch, proper usage including setting your fitness goal (measured by the watch face dial) and even sets the time for you.</p><p>Scrolling through the data with the crown isn’t the easiest method to access information but that’s a natural downside of this type of design. And, once you’re familiar with the order of the menu, things do speed up.</p><h2 id="app">App</h2><p>The Withings App stores data from all your collected Withings devices and so for those dedicated to the brand, it can store a lot of metrics. Mine has access to my ScanWatch and my Sleep Mat, and I highly recommend editing the home screen to ensure your preferred metrics are displayed first — I used to scroll past all kinds of data to access my sleep score.</p><p>In the app, you can access all the data collected from your ScanWatch displayed in charts and graphs. Overall, I’ve found these easy to scroll through and to understand, with data clearly displayed (I particularly enjoy the sleep tracking analytics, which provide a thorough overview with just a quick glance).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="r4dZ6Vo4Cm7xNjvPVp3udH" name="Withings ScanWatch 2 app" alt="A series of 3 screenshots of the Withings app: the homepage, the sleep tracking data and the temperature tracking" src="https://cdn.mos.cms.futurecdn.net/r4dZ6Vo4Cm7xNjvPVp3udH.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Withings)</span></figcaption></figure><p>You can also generate health reports in the app, drawing together data into a handy PDF you can send to your doctor.</p><p>For this review, I used the free Withings app, which I found helpful enough. For ‘health improvement scores’, you’ll need to upgrade to Withings+. This will give you access to AI insights and personalized care; useful for those looking to improve an aspect of health, rather than simply monitor.</p><h2 id="battery-life">Battery life</h2><p>Withings claims the ScanWatch 2 has 35 days of battery life. Based on my experience, that’s accurate: I started wearing mine on April 23rd and by July 3rd, I’d only charged it twice. Those who favor referring to the watch screen over the app are likely to find the battery drains quicker but for moderate usage, you can get at least a month of wear before charging becomes necessary.</p><p>Withings ScanWatch also claims a “2 hour” charge time. Again, this seems accurate. On my last charge, I noted I had 15% battery life at 10.04 a.m. — by 11.04 a.m., I was up to 90%. </p><p>You do need to take the ScanWatch off to charge it, so quick juice is necessary to avoid missing out on data. It also has a non-standard charger which is $24.95 to replace, so during those 35 days you don’t need it, keep it in a secure place.</p><h3 class="article-body__section" id="section-withings-scanwatch-2-should-you-buy"><span>Withings ScanWatch 2: Should you buy?</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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NEjti249cRzJdGhN3bndfY" name="Withings ScanWatch 2 on bed" alt="A closeup of the Withings ScanWatch 2 on a bed, with the display showing the reviewer's sleep time" src="https://cdn.mos.cms.futurecdn.net/NEjti249cRzJdGhN3bndfY.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><h2 id="buy-the-withings-scanwatch-2-if">Buy the Withings ScanWatch 2 if:</h2><p>✅<strong>You want a classic watch design: </strong>The ScanWatch 2 is an excellent blend of form and functionality, pairing a classic analog watch design with a subtle display and a handy dial. The result is a sleep tracker that doesn’t look like a sleep tracker.</p><p>✅<strong>You’re looking for all-round health tracking: </strong>Withings’s free access app collects sleep data, heart rate, activity levels, temperature and more to give a reliable and accurate overview of your health. It’s a lot of info that’s easy to access.</p><p>✅<strong>You rarely find time to charge your devices: </strong>The ScanWatch 2 has a maximum battery life of 35 days and can fully charge in just two hours. That means minimal time off the wrist (and losing precious data) plus with careful planning, you can travel without a charger.</p><h2 id="don-t-buy-the-withings-scanwatch-2-if">Don't buy the Withings ScanWatch 2 if...</h2><p><strong>❌ You won’t action, not just oversight: </strong>You’ll need to upgrade to the Withings+ if you want to turn your data into action with the help of AI intelligence and professional advice,</p><p><strong>❌ You want a sleek wearable: </strong>The ScanWatch 2 has a classic watch design but the downside is it’s a bulkier wearable. The FitBit Air has a much slimmer profile while the Oura Ring is the closest you’ll get to invisible sleep tracking.</p><p><strong>❌ You want top-class sleep data: </strong>While the ScanWatch 2 provides a decent insight into your sleep, Withings has another device that’s better suited to track your rest: the Sleep Mat. </p><h3 class="article-body__section" id="section-withings-scanwatch-2-alternatives"><span>Withings ScanWatch 2: Alternatives</span></h3>        <div class="featured_product_block featured_block_hero" data-id="07be6f9a-7ae0-11f1-abe0-0b5323a3830e">            <a href="https://www.withings.com/us/en/sleep" data-model-name="Withings Sleep Analyzer" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:100.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/ajAbuA6CSc4Ku3Nh53Jo9H.jpg" alt="Withings Sleep tracking mat"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Withings</div>                                        <div class="featured__title">Sleep mat</div>                                <div class="stars__reviews"><span itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating" 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><meta itemprop="bestRating" content="100.0" /><meta itemprop="worstRating" content="0.0" /><meta itemprop="ratingValue" content="80" /></span></div>                </div>                <div class="subtitle__description">                                                            <p><p>From the brand behind the ScanWatch the <a href="https://www.tomsguide.com/wellness/sleep-tech/withings-sleep-analyzer-review">Sleep analyzer mat</a> is for those who want detailed sleep tracking data. Also, as an under-the-mattress sleep tracker, you won't even know it's there. Cheaper than the ScanWatch 2 at $199.95, it's less well-rounded but better at accurate sleep tracking.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="07be704e-7ae0-11f1-b711-27736a6c5c19">            <a href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminum-Always/dp/B0FQFL8PZ5/" data-model-name="Apple Watch 11" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.30%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/SAhxofTxartcYTTRetdSqK.jpg" alt="Apple Watch Series 11"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Apple</div>                                        <div class="featured__title">Watch Series 11</div>                                <div class="stars__reviews"><span itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating" 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 class="icon icon-star"> </span><meta itemprop="bestRating" content="100.0" /><meta itemprop="worstRating" content="0.0" /><meta itemprop="ratingValue" content="100" /></span></div>                </div>                <div class="subtitle__description">                                                            <p><p>With detailed sleep tracking (plus <a href="https://www.tomsguide.com/wellness/sleep-problems/sleep-apnea">sleep apnea</a> detection) as well as impressive health and fitness tracking, the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch 11</a> a strong all-rounder. It lacks the exceptional battery life and chic design of the ScanWatch 2 but on the other hand, the large display is better for reading data.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="07be70bc-7ae0-11f1-9a5e-8dcedada2edd">            <a href="https://ouraring.com/store/rings/oura-ring-5/silver" data-model-name="Oura Ring 5" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:86.42%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/9FSTezSsDEc5RZwExBfRMM.jpg" alt="the Oura Ring 5 in gold"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Oura</div>                                        <div class="featured__title">Ring 5</div>                                <div class="stars__reviews"><span itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating" 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 class="icon icon-star half"></span><meta itemprop="bestRating" content="100.0" /><meta itemprop="worstRating" content="0.0" /><meta itemprop="ratingValue" content="90" /></span></div>                </div>                <div class="subtitle__description">                                                            <p><p>If you're eyeing up the ScanWatch 2, there's a good chance you want a fitness tracker that doesn't look like a fitness tracker. Enter the <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring 5</a>: small, sleek and discreet, it sits on your finger to take detailed health data. At $399 it's similarly priced to the ScanWatch 2 but even more unobtrusive.</p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 3 Apple Watch settings I always turn off to maximize battery life ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/3-apple-watch-settings-i-always-turn-off-to-maximize-battery-life</link>
                                                                            <description>
                            <![CDATA[ I'm a smartwatch expert, and these are the three Apple Watch settings I change for better battery performance... and you should too. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ax354qNZayQLumenwEZhWh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8rU2tWqBDwTMHpHnCVdkr8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 10 Jul 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/8rU2tWqBDwTMHpHnCVdkr8-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple Watch Ultra 3 showing battery life and low-power mode]]></media:description>                                                            <media:text><![CDATA[Apple Watch Ultra 3 showing battery life and low-power mode]]></media:text>
                                <media:title type="plain"><![CDATA[Apple Watch Ultra 3 showing battery life and low-power mode]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8rU2tWqBDwTMHpHnCVdkr8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple makes some of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> money can buy. However, battery life has never been the Apple Watch’s strong suit. The Series 11 lasts an average of 24 hours, the SE 3 lasts roughly 18 hours, and the Ultra 3 lasts about 42 hours per charge.</p><p>Looking to squeeze a little more juice? Apple’s low-power mode is one option. For example, on the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Series 11</a>, it can extend your battery life up to 38 hours per charge. The trade-off is that the handy features you paid for, like the always-on display and continuous heart rate monitoring, get disabled. </p><p>Rather than losing essential Apple Watch features, what follows are three settings you can change that won’t impact the user experience much but <em>will</em> noticeably improve your device’s battery life. </p><p>Best of all, you don’t need to own one of the <a href="https://www.tomsguide.com/best-picks/best-apple-watch">best Apple Watches</a>, i.e., the latest/greatest model. These battery life tips work for older models, too. </p><h3 class="article-body__section" id="section-1-turn-off-background-app-refresh"><span>1. Turn off 'Background app refresh'</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:4737px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="oao7rBQegWQ26TYxyxdeLE" name="AW11-background-app" alt="Apple Watch Series 11 battery life saving tips" src="https://cdn.mos.cms.futurecdn.net/oao7rBQegWQ26TYxyxdeLE.jpg" mos="" align="middle" fullscreen="" width="4737" height="2664" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The apps on your Apple Watch are constantly updating and/or refreshing with new content behind the scenes, which can lead to faster-than-normal battery drain, especially if you have loads of third-party ones. </p><p>For example, an app like AP News pulls in updates throughout the day so that when you open it, you see the newest headlines. Switching off background app refresh means that you may need to wait a few seconds for the freshest news to appear, but that’s a worthwhile trade-off for improved battery performance as far as I'm concerned. </p><p><strong>To switch background app refresh off, head to the settings menu > general, and scroll down.</strong></p><h3 class="article-body__section" id="section-2-turn-on-reduce-motion"><span>2. Turn on 'Reduce motion'</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:5234px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ynQKXmQzYQ4UkUZfvd5nQE" name="AW11-reduce-motion" alt="Apple Watch Series 11 battery life saving tips" src="https://cdn.mos.cms.futurecdn.net/ynQKXmQzYQ4UkUZfvd5nQE.jpg" mos="" align="middle" fullscreen="" width="5234" height="2944" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Apple wants your experience operating the Apple Watch to be as smooth and seamless as possible. As a result, the user interface is chock-full of quick animations that make transitioning from one app to another, for example, a more visually appealing experience. </p><p>However, these animations are far from essential. Reduce motion switches them off, saving you battery. Moreover, I find the difference between motion on and off hardly noticeable, and I’m guessing you will too. </p><p><strong>The reduced motion setting is located under the settings menu, followed by accessibility. Scroll about halfway down to toggle it. </strong></p><h3 class="article-body__section" id="section-3-turn-off-optimize-charge-limit"><span>3. Turn off 'Optimize charge limit'</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="urKTYqkYTYoBmgNGeEMpNE" name="AW11-opt-battery" alt="Apple Watch Series 11 battery life saving tips" src="https://cdn.mos.cms.futurecdn.net/urKTYqkYTYoBmgNGeEMpNE.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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Last but not least, to ensure I get the best possible battery life out of my Apple Watch, I always turn off the “optimize charge limit” setting. This feature is designed to prevent your smartwatch from overcharging, which should in turn extend its long-term battery life. </p><p>However, optimizing the charge limit also cuts off charging at 80%, which isn’t ideal. <strong>To turn off the optimize charge limit setting, head to the settings menu > battery > battery life.</strong></p><p>One note of caution: If you take my advice and switch it off to get that extra 20% juice, get in the habit of keeping an eye on your Apple Watch while it recharges. Leaving it unattended on a charger, especially overnight, could result in the need for a premature battery replacement. </p><p>Moreover, while older smartwatches take a few hours to fully juice up, the latest generations recharge from 0% to 100% in about an hour... so no excuses. </p><p>What are your favorite <a href="https://www.tomsguide.com/wellness/smartwatches/5-hidden-settings-that-extend-your-apple-watchs-battery-life">Apple Watch battery-saving tips</a>? Let me know in the comments below.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont">I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-apple-watch-11-vs-fitbit-air-and-theres-a-clear-winner">I manually counted 5,000 steps to test the Apple Watch 11 vs Fitbit Air, and Apple wins the accuracy battle while offering superior elevation data</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I counted 4,000 steps to test the Fitbit Air vs Pixel Watch 4 — and the Fitbit Air wins the accuracy battle with one major caveat ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-000-steps-with-the-fitbit-air-vs-pixel-watch-4-and-im-genuinely-shocked-by-the-results</link>
                                                                            <description>
                            <![CDATA[ I pitted the $99 Fitbit Air against the $349 Pixel Watch 4 in a head-to-head fitness tracking comparison to determine which is the more precise Google wearable. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HYafMbbwJyHnhSasJTYJuS</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/p7EE7sd3jMDNJaHNhZksb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 09 Jul 2026 09:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 09 Jul 2026 23:59:03 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/p7EE7sd3jMDNJaHNhZksb-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Google Pixel Watch 4 and Fitbit Air on a user&#039;s wrist against a yellow/green background]]></media:description>                                                            <media:text><![CDATA[Close-up of the Google Pixel Watch 4 and Fitbit Air on a user&#039;s wrist against a yellow/green background]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Google Pixel Watch 4 and Fitbit Air on a user&#039;s wrist against a yellow/green background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/p7EE7sd3jMDNJaHNhZksb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <div class="product"><a data-dimension112="8bf0b0e6-7aec-11f1-9120-ddbc45e99d13" data-action="Deal Block" data-label="best fitness trackers" data-dimension48="best fitness trackers" data-dimension25="$99" href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:858px;"><p class="vanilla-image-block" style="padding-top:95.22%;"><img id="6rQV9bADzd2zqYvNPGPxwE" name="Screenshot 2026-05-28 at 12.55.35 PM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6rQV9bADzd2zqYvNPGPxwE.png" mos="" align="middle" fullscreen="" width="858" height="817" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fitbit Air is one of the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html" data-dimension112="8bf0b0e6-7aec-11f1-9120-ddbc45e99d13" data-action="Deal Block" data-label="best fitness trackers" data-dimension48="best fitness trackers" data-dimension25="$99">best fitness trackers</a> in 2026, especially if you want an easy-to-wear, set-it-and-forget-it piece of tech that keeps tabs on your key health and fitness metrics with no distractions or fuss. <a class="view-deal button" href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV?th=1" target="_blank" rel="nofollow" data-dimension112="8bf0b0e6-7aec-11f1-9120-ddbc45e99d13" data-action="Deal Block" data-label="best fitness trackers" data-dimension48="best fitness trackers" data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="8bf0b168-7aec-11f1-8dcb-11e95c55bbe9" data-action="Deal Block" data-label="best full-featured smartwatches" data-dimension48="best full-featured smartwatches" data-dimension25="$349" href="https://www.bestbuy.com/product/google-pixel-watch-4-41mm-wi-fi-polished-silver-case-porcelain-band-2025/J39TC8JK7T/sku/6637232" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1348px;"><p class="vanilla-image-block" style="padding-top:109.35%;"><img id="ivKPobCKkt5YfBEYBd2tgR" name="Screenshot 2026-01-27 at 12.40.43 PM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ivKPobCKkt5YfBEYBd2tgR.png" mos="" align="middle" fullscreen="" width="1348" height="1474" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Pixel Watch 4 is Google's flagship smartwatch and one of the<a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch#section-best-smartwatch-for-android" data-dimension112="8bf0b168-7aec-11f1-8dcb-11e95c55bbe9" data-action="Deal Block" data-label="best full-featured smartwatches" data-dimension48="best full-featured smartwatches" data-dimension25="$349"> best full-featured smartwatches</a> you can buy, with loads of health and safety tools, workout insights, AI features, and more.<a class="view-deal button" href="https://www.bestbuy.com/product/google-pixel-watch-4-41mm-wi-fi-polished-silver-case-porcelain-band-2025/J39TC8JK7T/sku/6637232" target="_blank" rel="nofollow" data-dimension112="8bf0b168-7aec-11f1-8dcb-11e95c55bbe9" data-action="Deal Block" data-label="best full-featured smartwatches" data-dimension48="best full-featured smartwatches" data-dimension25="$349">View Deal</a></p></div><p>I pitted the $99 Fitbit Air against the $349 Pixel Watch 4 in a head-to-head fitness tracking comparison to determine which is the more precise Google wearable. The results genuinely surprised me.</p><p>The <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> is a lightweight, screen-free fitness tracking band that's as easy on the wallet as it is comfortable on the wrist. The <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-went-hands-on-with-google-pixel-watch-4-and-it-could-be-my-new-favorite-smartwatch-for-android">Pixel Watch 4</a> is Google's flagship smartwatch, with a large, bright display and features galore, including a handy, voice- or gesture-activated Gemini AI assistant. </p><p>To find out which of these flagship Google products is the more competent fitness tracker — at least when it comes to step-counting — I walked 4,000 steps with the Fitbit Air on my right wrist and the Pixel Watch 4 on my left. My primary control metric for the comparison is total steps taken. To ensure a precise tally on my end, I manually counted my steps, noting every hundred with a click of my old-school tally counter. </p><p>As a control for distance, pace, and climb, I brought along my iPhone 16 Plus and logged the walk using the Strava app. Find the results of the Fitbit Air vs Pixel Watch 4 walk test below.</p><h3 class="article-body__section" id="section-fitbit-air-vs-pixel-watch-4-fitness-tracking-accuracy-compared"><span>Fitbit Air vs Pixel Watch 4: fitness tracking accuracy compared</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:5212px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="uAUZPAs6PTLr7NyeADhfgH" name="Pixel4-v-FitbitAir-02" alt="Close-up of the Google Pixel Watch 4 and Fitbit Air in a user's hand against a bright red background" src="https://cdn.mos.cms.futurecdn.net/uAUZPAs6PTLr7NyeADhfgH.jpg" mos="" align="middle" fullscreen="" width="5212" height="2931" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>When it comes to tracking outdoor workouts, it's important to note a key difference between the Fitbit Air and Pixel Watch 4. The former lacks onboard GPS, so for location-based insights, you need to carry along a paired smartphone. </p><p>In addition to piggybacking off of your phone's GPS antenna, the Fitbit Air also relies on its altimeter for elevation data. The Pixel Watch 4, meanwhile, boasts both an onboard GPS antenna and a barometric altimeter. </p><p>Now, on to the test results!</p><h3 class="article-body__section" id="section-fitbit-air-vs-pixel-watch-4-walk-test-results"><span>Fitbit Air vs Pixel Watch 4: Walk test results </span></h3><div ><table><caption>4,000-step walk comparison: Fitbit Air vs Pixel Watch 4</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Fitbit Air</p></th><th  ><p>Pixel Watch 4</p></th><th  ><p>Control</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Steps</strong></p></td><td  ><p>3,993 steps</p></td><td  ><p>3,985 steps</p></td><td  ><p>4,000 steps (manual count)</p></td></tr><tr><td class="firstcol " ><p><strong>Distance</strong></p></td><td  ><p>2.15 miles</p></td><td  ><p>2.09 miles</p></td><td  ><p>2.14 miles (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Climb</strong></p></td><td  ><p>184 feet</p></td><td  ><p> 288 feet</p></td><td  ><p>255 feet (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average pace</strong></p></td><td  ><p>18 mins 02 secs</p></td><td  ><p>18 mins 33 secs</p></td><td  ><p> 17 mins 51 secs (Strava)</p></td></tr><tr><td class="firstcol " ><p><strong>Average heart rate</strong></p></td><td  ><p>114 bpm</p></td><td  ><p>121 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Max heart rate</strong></p></td><td  ><p>147 bpm</p></td><td  ><p>161 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Calories burned</strong></p></td><td  ><p>284 calories</p></td><td  ><p>303 calories</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p><strong>Battery usage</strong></p></td><td  ><p>3%</p></td><td  ><p>4%</p></td><td  ><p>n/a</p></td></tr></tbody></table></div><p>I took exactly 4,000 steps (manually counted) during my 38-minute walk, including a stroll up <a href="https://www.tomsguide.com/home/electric-bikes/i-tried-to-ride-treks-new-ebike-up-the-steepest-hill-in-seattle-and-it-didnt-go-as-planned">Seattle's steepest block </a>(for old-time's sake). While both wearables noted step count totals within 15 steps of my actual count — a seriously impressive result and well within a reasonable margin for error — much to my surprise, the Fitbit Air was a little bit closer than the Pixel Watch 4.</p><p>The Air and Pixel Watch 4 also beat Strava, which logged 3,978 steps. </p><p>The Fitbit Air's distance data is additionally more in line with the control; the same goes for pace. However, the Air's climb data is woefully inaccurate, a result I noted in my previous walk test with the <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-apple-watch-11-vs-fitbit-air-and-theres-a-clear-winner">Fitbit Air vs Apple Watch 11</a>.</p><p>When it comes to heart rate and calories, the Air logged a slightly less aggressive workout compared to the Pixel Watch 4. The Air also used marginally less battery — not surprising, since it lacks a display.</p><h3 class="article-body__section" id="section-fitbit-air-vs-pixel-watch-4-winner"><span>Fitbit Air vs Pixel Watch 4: Winner </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:4805px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bFju7tvNftUTkppemXS2tT" name="Fitbit-Air-lead-05" alt="Close-up of the Fitbit Air on-wrist on a red strap against a blue background" src="https://cdn.mos.cms.futurecdn.net/bFju7tvNftUTkppemXS2tT.jpg" mos="" align="middle" fullscreen="" width="4805" height="2703" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>And the winner is... the Fitbit Air, thanks to a slightly more accurate step count total, pace metric, and distance data. That said, the Air's win versus the Pixel Watch 4 comes with an asterisk due to disappointing elevation tracking performance.</p><p>The Pixel Watch 4, meanwhile, performed with acceptable accuracy across the board, including measuring my climb. For this reason, as someone who loves mountain sports, I'd likely opt for the latest Pixel Watch over the Fitbit Air for logging my next adventure. What do you think? Let me know which Google wearable <em>you</em> prefer in the poll below.</p><p>Which fitness trackers or smartwatches should I test head-to-head next?</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ORMGAW"></div>                            </div>                            <script src="https://kwizly.com/embed/ORMGAW.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-3-000-steps-with-the-fitbit-air-vs-garmin-forerunner-70-and-im-seriously-amazed-by-the-results">I walked 3,000 steps with the Fitbit Air vs Garmin Forerunner 70 — and I’m seriously amazed by the results</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free">Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Garmin Cirqa wishlist: 3 ways Garmin’s rumored screen-free tracker can beat the Fitbit Air ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/garmin-cirqa-wishlist-3-ways-garmins-rumored-screen-free-tracker-can-beat-the-fitbit-air</link>
                                                                            <description>
                            <![CDATA[ Garmin is rumored to be jumping into the screen-free fitness tracker market. Here’s how the brand can beat the competition, including the Whoop 5.0 and Fitbit Air, at its own game. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qKeTLoeqm4AuNf8f9stTBG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sD3RENyeioa4hXC5AS62n5-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 09 Jul 2026 00:48:24 +0000</pubDate>                                                                                                                                <updated>Thu, 09 Jul 2026 00:50:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/sD3RENyeioa4hXC5AS62n5-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The sensors on the Garmin Vivosmart 4 fitness tracker]]></media:description>                                                            <media:text><![CDATA[The sensors on the Garmin Vivosmart 4 fitness tracker]]></media:text>
                                <media:title type="plain"><![CDATA[The sensors on the Garmin Vivosmart 4 fitness tracker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sD3RENyeioa4hXC5AS62n5-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Rumors of a <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmins-screenless-fitness-tracker-just-leaked-and-if-this-price-is-accurate-the-fitbit-air-wont-be-worried">screen-free Garmin</a> fitness tracker, potentially called the “Cirqa,” have reached a fever pitch. Plus, the fact that Garmin has officially trademarked, ”Cirqa” in several markets only adds to the anticipation for what could very well be the biggest challenger to the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> in 2026.</p><p>Screen-free fitness trackers are clearly having a moment. Google just debuted its $99 Fitbit Air band to positive reviews, including from yours truly, and Oura just dropped a thinner, comfier flagship in the <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring 5</a>. </p><p>Of course, you also have the <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a>, <a href="https://www.tomsguide.com/wellness/fitness-trackers/polars-screenless-fitness-tracker-has-arrived-heres-everything-you-need-to-know-about-the-whoop-rival">Polar Loop</a>, and <a href="https://www.tomsguide.com/wellness/fitness-trackers/amazfit-helio-strap-review">Amazfit Helio Strap</a>. So, what does Garmin need to do with the rumored Cirqa to set it apart from the competition? I have three big ideas.</p><h3 class="article-body__section" id="section-1-onboard-gps"><span>1. Onboard GPS</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:4923px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="v4R3RdVkt2tearzZXDp52N" name="FitbitAir-rev-07" alt="Close-up of the Fitbit Air on a person's wrist" src="https://cdn.mos.cms.futurecdn.net/v4R3RdVkt2tearzZXDp52N.jpg" mos="" align="middle" fullscreen="" width="4923" height="2769" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>In 2026, if you want to onboard GPS in your fitness-tracking wearable, you need to either opt for one of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> or one of the<a href="https://www.tomsguide.com/us/best-fitbit,review-3203.html"> best fitness trackers</a>, like the <a href="https://www.tomsguide.com/reviews/fitbit-charge-6">Fitbit Charge 6</a>. As of writing, there aren’t any smart rings or screen-free trackers with onboard GPS.</p><p>The advantage, of course, of a built-in GPS antenna is the ability to track an outdoor workout, like a walk, run, hike, bike ride, etc., without the need to carry a paired smartphone. Even the Oura Ring 5 and Fitbit Air piggyback off your phone’s location data when logging an outdoor exercise. </p><h3 class="article-body__section" id="section-2-wide-ranging-reliable-auto-workout-detection"><span>2. Wide-ranging, reliable auto-workout detection </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:2599px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yii3yJCsdqgakLrjq5eeKE" name="Oura Ring 5" alt="photos of the Oura Ring 5" src="https://cdn.mos.cms.futurecdn.net/yii3yJCsdqgakLrjq5eeKE.jpg" mos="" align="middle" fullscreen="" width="2599" height="1462" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One of my biggest complaints about the Fitbit Air is the auto workout detection feature. It only supports a very small selection of workout types, and you need to be doing one of those supported exercises for a minimum of 15-20 minutes for the feature to kick in.</p><p>The<a href="https://www.tomsguide.com/best-picks/best-garmin-watch"> best Garmin watches</a> already support loads of workout types; however, like the Fitbit Air, auto-detect is limited to roughly five common exercises, like walks, runs, and swims. Expanding that list and ensuring detection works even after a short duration would give the rumored Garmin Cirqa a major advantage over the Fitbit Air. </p><p>Perhaps Garmin should ask Oura for advice on how to best log a range of exercise types without any user input; the latest generation Oura Ring autodetects 40 different workout types.</p><h3 class="article-body__section" id="section-3-two-weeks-or-more-of-battery"><span>3. Two weeks or more of battery</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="m58aY2hFFy6FdCrzDEoo69" name="Oura vs Whoop vs Fitbit Air" alt="a photo of Oura Ring 5, Fitbit Air, Whoop MG" src="https://cdn.mos.cms.futurecdn.net/m58aY2hFFy6FdCrzDEoo69.jpg" mos="" align="middle" fullscreen="" width="3000" height="1688" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Finally, the rumored Garmin Cirqa could set itself apart from the Fitbit Air by cruising well beyond the week-long battery barrier. In my testing, the Fitbit Air can easily last up to seven days per charge. However, that’s nothing compared to the Whoop 5.0, which is good for up to two weeks.</p><p>If Garmin wants the Cirqa to be considered a premium wearable, as the <a href="https://www.tomsguide.com/wellness/fitness-trackers/garmins-screenless-fitness-tracker-just-leaked-and-if-this-price-is-accurate-the-fitbit-air-wont-be-worried">rumored price</a> suggests it might be, then matching or surpassing the latest Whoop’s battery life is a must.</p><p>What are you hoping to see in the rumored Garmin Cirqa? Let me know in the comments below.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free">Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I manually counted 5,000 steps to test the Apple Watch 11 vs Fitbit Air, and Apple wins the accuracy battle while offering superior elevation data ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-walked-5-000-steps-with-the-apple-watch-11-vs-fitbit-air-and-theres-a-clear-winner</link>
                                                                            <description>
                            <![CDATA[ Which popular wearable is the more competent fitness tracker, the Apple Watch 11 or the Fitbit Air? I decided to find out by tracking the same workout with both. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UUAxKKpkGzg6ubeodyLVWJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4gLpwabHDL6mCHnbXWz6uM-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 08 Jul 2026 11:30:00 +0000</pubDate>                                                                                                                                <updated>Wed, 08 Jul 2026 19:52:52 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/4gLpwabHDL6mCHnbXWz6uM-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Apple Watch Series 11 next to the Fitbit Air; both are on colorful straps]]></media:description>                                                            <media:text><![CDATA[Close-up of the Apple Watch Series 11 next to the Fitbit Air; both are on colorful straps]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Apple Watch Series 11 next to the Fitbit Air; both are on colorful straps]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4gLpwabHDL6mCHnbXWz6uM-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple Watch Series 11 or Fitbit Air, which popular wearable is the more competent/reliable fitness tracker? I decided to find out by performing one of my renowned head-to-head walk tests.</p><p>For this showdown, I wore the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch 11</a> on my left wrist and the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> on my right wrist for a 5,000-step walk around beautiful Seattle, Washington. How do I know it was 5,000 steps? I counted every darn one, with some assistance from my trusty tally counter (one click= 100 steps).  </p><p>Now, if I were a betting man (I'm not), my money would be on the Series 11 to come out victorious. Not only is it one of the <a href="https://www.tomsguide.com/wellness/smartwatches/best-smartwatch">best smartwatches</a> in 2026, but it's also four times the cost of the Fitbit Air: $399 vs $99.</p><p>Then again, the Fitbit Air may be affordable, but it's also one of the <a href="https://www.tomsguide.com/us/best-fitbit,review-3203.html">best fitness trackers </a>in 2026. Not only that, when I pitted in a separate walk test versus the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-se-3-review">Apple Watch SE 3</a>, the Air surprisingly came out victorious. Will this be a repeat win? Read on!</p><div class="product"><a data-dimension112="5cba36ea-7a41-11f1-b31b-af2e03721331" data-action="Deal Block" data-label="The Fitbit Air is a diminutive, comfortable fitness tracker with no screen or buttons. Just $99, it boasts nearly a week of battery and lots of health, sleep, and workout insights." data-dimension48="The Fitbit Air is a diminutive, comfortable fitness tracker with no screen or buttons. Just $99, it boasts nearly a week of battery and lots of health, sleep, and workout insights." data-dimension25="$99" href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:858px;"><p class="vanilla-image-block" style="padding-top:95.22%;"><img id="6rQV9bADzd2zqYvNPGPxwE" name="Screenshot 2026-05-28 at 12.55.35 PM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6rQV9bADzd2zqYvNPGPxwE.png" mos="" align="middle" fullscreen="" width="858" height="817" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fitbit Air is a diminutive, comfortable fitness tracker with no screen or buttons. Just $99, it boasts nearly a week of battery and lots of health, sleep, and workout insights. <a class="view-deal button" href="https://www.amazon.com/Google-Fitbit-Air-Screenless-Personalized/dp/B0GTMJF7PV?th=1" target="_blank" rel="nofollow" data-dimension112="5cba36ea-7a41-11f1-b31b-af2e03721331" data-action="Deal Block" data-label="The Fitbit Air is a diminutive, comfortable fitness tracker with no screen or buttons. Just $99, it boasts nearly a week of battery and lots of health, sleep, and workout insights." data-dimension48="The Fitbit Air is a diminutive, comfortable fitness tracker with no screen or buttons. Just $99, it boasts nearly a week of battery and lots of health, sleep, and workout insights." data-dimension25="$99">View Deal</a></p></div><div class="product"><a data-dimension112="5cba3776-7a41-11f1-a017-358c1246c879" data-action="Deal Block" data-label="The Apple Watch Series 11 is one of the most high-tech smartwatches money can buy, with plenty of apps and features to keep you connected, healthy, safe, and fit. It also boasts a big, bright touchscreen and up to 24 hours of battery per charge." data-dimension48="The Apple Watch Series 11 is one of the most high-tech smartwatches money can buy, with plenty of apps and features to keep you connected, healthy, safe, and fit. It also boasts a big, bright touchscreen and up to 24 hours of battery per charge." data-dimension25="$329" href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminum-Always/dp/B0FQFL8PZ5?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3574px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jng7bX5CBKGUQwXAqm8PR8" name="AW 11" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jng7bX5CBKGUQwXAqm8PR8.jpg" mos="" align="middle" fullscreen="" width="3574" height="3574" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Apple Watch Series 11 is one of the most high-tech smartwatches money can buy, with plenty of apps and features to keep you connected, healthy, safe, and fit. It also boasts a big, bright touchscreen and up to 24 hours of battery per charge. <a class="view-deal button" href="https://www.amazon.com/Apple-Watch-Smartwatch-Aluminum-Always/dp/B0FQFL8PZ5?th=1" target="_blank" rel="nofollow" data-dimension112="5cba3776-7a41-11f1-a017-358c1246c879" data-action="Deal Block" data-label="The Apple Watch Series 11 is one of the most high-tech smartwatches money can buy, with plenty of apps and features to keep you connected, healthy, safe, and fit. It also boasts a big, bright touchscreen and up to 24 hours of battery per charge." data-dimension48="The Apple Watch Series 11 is one of the most high-tech smartwatches money can buy, with plenty of apps and features to keep you connected, healthy, safe, and fit. It also boasts a big, bright touchscreen and up to 24 hours of battery per charge." data-dimension25="$329">View Deal</a></p></div><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/LCKJ8K4sdXk" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-apple-watch-11-vs-fitbit-air-tech-compared"><span>Apple Watch 11 vs Fitbit Air: tech compared</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:4835px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="kQiKSFbo9N8ktNQvJumyeN" name="FitbitAir-v-AW11-03" alt="Close-up of the Apple Watch Series 11 next to the Fitbit Air; both are on colorful straps" src="https://cdn.mos.cms.futurecdn.net/kQiKSFbo9N8ktNQvJumyeN.jpg" mos="" align="middle" fullscreen="" width="4835" height="2720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>When it comes to wrist-based trackers, the Fitbit Air and Apple Watch 11 couldn't be more different. The former has no screens, buttons, or notifications, and lasts up to a week. </p><p>The Series 11, meanwhile, is a super-connected device, boasting a large, bright touchscreen, multiple physical buttons, and compatibility with a dizzying array of apps. That said, the Series 11 comes up short on battery life; 24 hours per charge is the norm.</p><p>Another major difference: the Fitbit Air has no onboard GPS for location tracking or altimeter for elevation data, so you need to carry a smartphone along when logging an outdoor workout. The Apple Watch 11, on the other wrist, has both GPS and an altimeter.</p><p>With that out of the way, let's move on to the results!</p><h3 class="article-body__section" id="section-apple-watch-11-vs-fitbit-air-walk-test-results"><span>Apple Watch 11 vs Fitbit Air: Walk test results </span></h3><div ><table><caption>5,000-step walk comparison: Apple Watch 11 vs Fitbit Air</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Apple Watch 11</p></th><th  ><p>Fitbit Air</p></th><th  ><p>Control</p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Steps</p></td><td  ><p>5,053 steps</p></td><td  ><p> 5,108 steps</p></td><td  ><p>steps (manual count)</p></td></tr><tr><td class="firstcol " ><p>Distance</p></td><td  ><p>2.63 miles</p></td><td  ><p>2.72 miles</p></td><td  ><p>2.39 miles (Strava)</p></td></tr><tr><td class="firstcol " ><p>Climb</p></td><td  ><p>372 feet</p></td><td  ><p>205 feet</p></td><td  ><p>328 feet (Strava)</p></td></tr><tr><td class="firstcol " ><p>Average pace </p></td><td  ><p>18 mins 51 secs</p></td><td  ><p>18 mins 03 secs</p></td><td  ><p>17 mins 22 secs (Strava)</p></td></tr><tr><td class="firstcol " ><p>Average heart rate</p></td><td  ><p>119 bpm</p></td><td  ><p>119 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p>Max heart rate</p></td><td  ><p> 153 bpm</p></td><td  ><p>153 bpm</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p>Calories burned</p></td><td  ><p>312 calories </p></td><td  ><p>373 calories</p></td><td  ><p>n/a</p></td></tr><tr><td class="firstcol " ><p>Battery usage</p></td><td  ><p>6%</p></td><td  ><p>1%</p></td><td  ><p>n/a</p></td></tr></tbody></table></div><p>Before we begin, it's worth noting that Strava appears to have had a "hiccup" while recording this walk test. How do I know? The app logged just 4,506 steps, which is a major red flag. Normally, Strava's step-count data is within 10-20 steps of my actual count. TLDR: Take Strava's distance, climb, and pace data with a grain of salt.</p><p>Anyhow, both the Apple Watch 11 and Fitbit Air performed admirably when it came to keeping an accurate tally of my steps — anything within ~150 steps of the control is considered excellent in my book —  but the Apple Watch was just a little closer!</p><p>Distance data between the Apple Watch and Fitbit Air is similar enough for my liking. The Fitbit noted slightly more ground covered but also a faster pace, which checks out.</p><p>The Fitbit Air's elevation metric is concerningly inaccurate (this walk was particularly hill-heavy), which doesn't make a whole lot of sense, given the device can piggyback off of the iPhone 16 Plus's climb data. This also isn't the first time I experienced less-than-precise elevation tracking insights from the Fitbit Air; it was also way lower than expected versus the <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-500-steps-with-the-fitbit-air-vs-apple-watch-se-3-and-im-surprised-by-the-winner">Apple Watch SE 3</a>.</p><p>Fortunately, the Fitbit Air finishes strong: Heart rate data is a perfect match with the Apple Watch Series 11, a result I love to see. Meanwhile, the Air logged slightly more calories burned, but used way less battery during my ~42-minute stroll. </p><h3 class="article-body__section" id="section-apple-watch-11-vs-fitbit-air-winner"><span>Apple Watch 11 vs Fitbit Air: Winner </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:5477px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WcgA326oXsje3z5eX8zdrM" name="FitbitAir-v-AW11-02" alt="Close-up of the Apple Watch Series 11 next to the Fitbit Air; both are on colorful straps" src="https://cdn.mos.cms.futurecdn.net/WcgA326oXsje3z5eX8zdrM.jpg" mos="" align="middle" fullscreen="" width="5477" height="3081" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Ultimately, the Apple Watch Series 11 wins this showdown of fitness tracking accuracy against the Fitbit Air, with a more precise total step count and climb data. </p><p>Which fitness trackers or smartwatches should I pit head-to-head next? Let me know in the comments below. Also, which do you prefer, the Apple Watch 11 or the Fitbit Air? Share your opinion in the poll below.  </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e47DBX"></div>                            </div>                            <script src="https://kwizly.com/embed/e47DBX.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-3-000-steps-with-the-fitbit-air-vs-garmin-forerunner-70-and-im-seriously-amazed-by-the-results">I walked 3,000 steps with the Fitbit Air vs Garmin Forerunner 70 — and I’m seriously amazed by the results</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/the-fitbit-air-is-basically-just-a-screen-less-fitbit-inspire-3-and-thats-a-very-good-thing">The Fitbit Air is basically just a screen-less Fitbit Inspire 3 — and that’s a very good thing</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker">Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Oura vs Whoop vs Fitbit Air — 5 questions to ask yourself before buying a screen-free fitness tracker ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/oura-whoop-or-fitbit-air-5-questions-to-ask-yourself-before-buying-a-screen-free-fitness-tracker</link>
                                                                            <description>
                            <![CDATA[ From the Oura Ring 5 to the Fitbit Air to the Whoop 5.0, screen-less health and fitness trackers are more popular than ever. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8AGUdKRTVHgAwtdJvVRtk6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/m58aY2hFFy6FdCrzDEoo69-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 07 Jul 2026 11:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 09 Jul 2026 23:41:40 +0000</updated>
                                                                                                                                            <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/m58aY2hFFy6FdCrzDEoo69-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of Oura Ring 5, Fitbit Air, Whoop MG]]></media:description>                                                            <media:text><![CDATA[a photo of Oura Ring 5, Fitbit Air, Whoop MG]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of Oura Ring 5, Fitbit Air, Whoop MG]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/m58aY2hFFy6FdCrzDEoo69-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>From the Oura Ring 5 to the Fitbit Air to the Whoop 5.0, screen-less health and fitness trackers are more popular than ever. But is a display-free wearable better than, say, the <a href="https://www.tomsguide.com/us/best-gps-watches,review-2638.html">best smartwatch</a> on the market today?</p><p>That depends on your expectations for the device, namely, whether you want a piece of tech that monitors your health passively or something you interact with more actively. </p><p>As TG’s resident wearables expert — and someone who just reviewed the new <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> — below are the five biggest things to consider before committing to the no-screen lifestyle. </p><h3 class="article-body__section" id="section-1-is-distraction-free-the-way-to-be"><span>1. Is distraction-free the way to be?</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:4654px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3ZgyaboUC5K2rnhcC6Kifi" name="Inspire3-v-Air-02" alt="Close-up of the Fitbit Inspire 3 next to the Fitbit Air on a user's wrist" src="https://cdn.mos.cms.futurecdn.net/3ZgyaboUC5K2rnhcC6Kifi.jpg" mos="" align="middle" fullscreen="" width="4654" height="2618" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Whether you're considering one of the <a href="https://www.tomsguide.com/wellness/fitness-trackers/best-smart-rings">best smart rings</a>, like the <a href="https://www.tomsguide.com/wellness/smart-rings/oura-ring-5-hands-on-review-ive-worn-the-worlds-smallest-smart-ring-for-a-week-and-it-changes-fitness-tracking-forever">Oura Ring 5</a> or the more wallet-friendly <a href="https://www.tomsguide.com/wellness/smart-rings/ringconn-gen-2-air-review-this-budget-smart-ring-beats-the-oura-ring-4-in-three-big-ways">Ringconn Gen 2 Air</a>, or a screen-less fitness band, like the <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a> or Fitbit Air, all of these wearables promise distraction-free health and fitness tracking insights.</p><p>Of course, if you want mirrored smartphone notifications, there is no shortage of wrist-based wearables that fill the role, including the <a href="https://www.tomsguide.com/reviews/fitbit-inspire-3">$99 Fitbit Inspire 3</a> and <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-reviewed-this-usd49-fitness-tracker-almost-a-year-ago-and-im-still-wearing-it-today-heres-why">$50 Amazfit Band 7</a>. In fact, when comparing the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-vs-fitbit-inspire-3-which-usd99-fitness-tracker-wins">Fitbit Air vs. the Fitbit Inspire 3</a>, both devices offer broadly the same set of data; the Inspire 3 is just a little more "connected."</p><p>The point is, when it comes to screen-free fitness trackers in 2026, giving up the display also means giving up the ability to receive on-wrist/finger smartphone alerts. If that sounds delightful, read on.</p><h3 class="article-body__section" id="section-2-am-i-ready-to-bond-with-a-companion-app"><span>2. Am I ready to bond with a companion app?</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:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GcmoiqjEbMzcEdFygVHbAY" name="Oura sleep tracking prompts" alt="A woman's hand with pink nails wearing a silver Oura Ring on index finger surrounded by screenshots from Oura app of sleep tracking prompts" src="https://cdn.mos.cms.futurecdn.net/GcmoiqjEbMzcEdFygVHbAY.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Most of the best screen-free wellness trackers, including the Oura Ring 5 and Fitbit Air, lack buttons, which means the companion app is your new best friend, whether you're checking how much battery you have left or trying to start tracking a workout. </p><p>As such, it's a good idea to get a sense of whether or not you vibe with, say, the Google Health app (<a href="https://www.tomsguide.com/wellness/fitness/the-fitbit-app-is-officially-dead-but-dont-panic-its-replacement-is-even-better">formerly the Fitbit app</a>) if you're considering the Fitbit Air. It's also worth mentioning that both Oura and Whoop charge monthly fees for their respective apps. </p><p>That said, there are plenty of subscription-free smart rings and trackers available (some with screens, some without). The tradeoff is that Oura and Whoop's holistic insights are the most in-depth across the board, especially for hardcore athletes. The Fitbit Air, on the other wrist, is subscription-optional and more geared toward casual health-conscious users.</p><h3 class="article-body__section" id="section-3-smart-features-what-smart-features"><span>3. Smart features? What smart 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:3346px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DrGLk5J27hSMuPjPQNnEkM" name="IMG_3567" alt="a photo of the Whoop MG on the wrist" src="https://cdn.mos.cms.futurecdn.net/DrGLk5J27hSMuPjPQNnEkM.jpg" mos="" align="middle" fullscreen="" width="3346" height="1882" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>With no display, buttons, or notifications, it probably doesn't come as much of a surprise that the best screen-free fitness trackers also lack support for smart features. Still, I would love to see NFC added to a smart ring, if for no other reason, because paying for something with a tap of the finger sounds positively futuristic. </p><h3 class="article-body__section" id="section-4-no-gps-no-problem"><span>4. No GPS, no problem?</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:2725px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="3NGtETDM2oCM52k7CxYYoe" name="RingConn2Air-14" alt="Close-up of the Ringconn Gen 2 Air smart ring on a user's index finger" src="https://cdn.mos.cms.futurecdn.net/3NGtETDM2oCM52k7CxYYoe.jpg" mos="" align="middle" fullscreen="" width="2725" height="1533" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>For my outdoor workout peeps, one of the biggest considerations to make before investing in a screen-free wearable is whether or not you can get by without onboard GPS. </p><p>While many of the best smartwatches and some of the <a href="https://www.tomsguide.com/us/best-fitbit,review-3203.html">best fitness trackers</a> have built-in GPS antennas, no smart rings or screen-free trackers do. This means, for accurate location-based data when working out, you'll need to bring your paired smartphone along for insights into your distance, speed, pace, climb, and more after a run, walk, bike ride, etc.</p><h3 class="article-body__section" id="section-5-am-i-big-on-battery-life"><span>5. Am I big on battery life?</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:3986px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9ZrfpRB5krdJGJhqZGcMMg" name="IMG_8507" alt="a photo of the Whoop MG and Fitbit Air" src="https://cdn.mos.cms.futurecdn.net/9ZrfpRB5krdJGJhqZGcMMg.jpg" mos="" align="middle" fullscreen="" width="3986" height="2242" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It still kind of blows my mind that one of the most popular smartwatches in 2026 only lasts for roughly 24 hours per charge. I'm speaking, of course, of the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch Series 11</a>.</p><p>Fortunately, screen-free wearables, by and large, beat their display-graced siblings when it comes to longevity. In fact, from smart rings to fitness bands, most will last up to a week, sometimes more, per charge. </p><p>What do you think of screen-free wearables? Do you already own one? Are you considering one? Let me know in the poll or comments below. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XkwQ3X"></div>                            </div>                            <script src="https://kwizly.com/embed/XkwQ3X.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free">Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried">Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/take-off-that-apple-watch-5-reasons-why-its-okay-to-swap-your-smartwatch-for-a-dumb-watch">5 reasons why I sometimes still wear a 'dumb' watch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’m a deep sleeper, and I wish I’d found this hidden Fitbit Air setting weeks ago ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/im-a-deep-sleeper-and-i-wish-id-found-this-hidden-fitbit-air-setting-weeks-ago</link>
                                                                            <description>
                            <![CDATA[ Making this simple tweak can change how well your Fitbit Air wakes you up, if you're a deep sleeper, that is. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">GjGDzgRRxys5FNyrUBigcc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Mimn2jQmsFeajNnNQ8NWGU-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 05 Jul 2026 07:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &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/Mimn2jQmsFeajNnNQ8NWGU-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[a photo of the Fitbit Air on the wrist ]]></media:description>                                                            <media:text><![CDATA[a photo of the Fitbit Air on the wrist ]]></media:text>
                                <media:title type="plain"><![CDATA[a photo of the Fitbit Air on the wrist ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Mimn2jQmsFeajNnNQ8NWGU-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’m not sure whether it’s the fact I’m training for a marathon (again), or that I have a toddler who wakes me up at least once a night, but when I do sleep, I go into a coma. </p><p>I’ve been seriously impressed with the new $99 <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> — in fact, I’d go as far as to say it’s one of the best wearables to launch so far this year, but I’ve had one issue with it: the haptic alarm just isn’t strong enough to wake me from said sleep coma in the mornings. </p><p>I know what you’re thinking — surely my two-year-old is my alarm clock, and you’d be right, but as any parent knows, if I want to drink a warm cup of coffee, do a quick Pilates workout, or just sit and stare at my phone in silence, the only way to do so is to wake up before he does. Luckily, I’ve found a hidden Fitbit Air hack that solves this problem — read on to find out more. </p><section class="howto-block">                    <h3>How to change vibration settings on Fitbit Air</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/zCBBhA82yv8MGUKAmpHWt5.jpg"                                        alt="Close-up of the sensors on the Fitbit Air"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/zCBBhA82yv8MGUKAmpHWt5.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Dan Bracaglia/Tom's Guide)</div></figure>                    <p><p>I’m not sure why Fitbit made this simple tweak so difficult to find, but you can, in fact, change the level of vibration on your Fitbit Air. By default, the haptic alerts on the alarm feature are set to low, so if, like me, you’re not finding them powerful enough to wake you up in the morning, here’s how to fix it.</p><p>Head to the <strong>Google Health app</strong>, and tap on <strong>Devices</strong> in the top left-hand corner. Select your <strong>Fitbit Air. </strong>Tap <strong>Device Preferences. </strong>The top option is <strong>Vibration Settings. </strong>By default, you’ll see that Vibration is set to low, so if you’re finding this hasn’t been strong enough to wake you up, you can switch this to <strong>High</strong>. </p></p>                </section><p>I found that by making this simple tweak, I was <em>definitely </em>able to feel the alarm going off on my wrist in the morning. It was still silent enough that it didn’t wake my toddler if he had crept into my bed at 2 am, and I was able to have 20 minutes of peace before my day began. </p><p>If I didn’t have a human alarm clock, I’d love the custom alarm schedule on the Fitbit Air, which allows you to set different alarms for different days of the week. The Smart Wake feature also looks great for those who don’t want such an abrupt start to their day — the Fitbit Air will gently wake you up in a timeframe that’s best for your REM sleep, helping you wake up feeling more refreshed. A girl can only dream. </p><p>Did you know about this hidden vibration setting? Follow Tom’s Guide for more Fitbit Air tips and tricks. </p><p><em><strong>Follow </strong></em><a href="https://www.instagram.com/tomsguidefitness/" target="_blank"><em><strong>Tom's Guide fitness</strong></em></a><em><strong> on Instagram for more workouts, routines, tips, and tricks.</strong></em></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/wellness/smartwatches/take-off-that-apple-watch-5-reasons-why-its-okay-to-swap-your-smartwatch-for-a-dumb-watch">I review smartwatches for a living, but these are 5 reasons why I sometimes still wear a 'dumb' watch</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch Series 12 rumors — everything we know so far</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/garmins-rumored-screen-less-wearable-just-might-be-the-subscription-free-whoop-rival-ive-been-waiting-for">Garmin’s rumored screen-less wearable just might be the subscription-free Whoop rival I’ve been waiting for</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tracked my sleep on Fitbit Air vs Whoop for a week — does spending more buy you better sleep data? ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/i-tracked-sleep-fitbit-air-vs-whoop-mg-one-week</link>
                                                                            <description>
                            <![CDATA[ I compared Fitbit Air and Whoop MG sleep tracking over seven nights to see how closely the two agreed. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nttfASf4kzrc36seBiJzY8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/WSbSWrhCAzEANUyvE5kg4M-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 04 Jul 2026 06:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                                    <dc:creator><![CDATA[ Sanuj Bhatia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8p5BvMVA7cnu5AWkxnTjRC.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/WSbSWrhCAzEANUyvE5kg4M-1280-80.jpg">
                                                            <media:credit><![CDATA[Sanuj Bhatia / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Google Fitbit Air in the hands of the author]]></media:description>                                                            <media:text><![CDATA[Google Fitbit Air in the hands of the author]]></media:text>
                                <media:title type="plain"><![CDATA[Google Fitbit Air in the hands of the author]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/WSbSWrhCAzEANUyvE5kg4M-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Ever since the <a href="https://www.tomsguide.com/wellness/fitness-trackers/the-fitbit-air-is-a-user-friendly-fitness-tracker-thats-just-usd99-at-best-buy">Fitbit Air launched</a> in May 2026, the conversation has almost always been about its price point. Reviews have been calling it a "$100 Whoop killer," and even we named it the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">best Whoop alternative <em>for the rest of us</em></a>. But one thing everyone seems to be missing is whether the tracking is actually any good. </p><p>Sure, it costs less, but does the Fitbit and Google name automatically mean it's great at tracking your health? Does it even give insights that are, first of all, accurate and then actually useful? </p><p>I've been tracking my sleep with both the <a href="https://www.tomsguide.com/wellness/fitness-trackers/i-tested-fitbit-air-vs-whoop-side-by-side-heres-the-screenless-fitness-tracker-id-buy">Fitbit Air and the Whoop MG</a> for a week, and the Fitbit Air actually held up much better than I expected. It's not perfect, though, and there are a few things you should know before buying one.</p><h2 id="here-s-how-i-tested-both-trackers-side-by-side">Here's how I tested both trackers side by side</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SGCZVmHfd2ygyWi2Jy45xL" name="fitbit-air-3" alt="Google Fitbit Air in the hands of the author" src="https://cdn.mos.cms.futurecdn.net/SGCZVmHfd2ygyWi2Jy45xL.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Before we get into the numbers, there's one thing worth knowing upfront: I've been using the Whoop MG for over a year now. It's been my primary <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">fitness and health tracking device</a> for that entire time, which means it has a lot more context about my body compared to the Fitbit Air. </p><p>I got the Fitbit Air around June 16 and started properly testing it from the night of June 17. For this test, I wore the Fitbit Air on my left, non-dominant wrist, while my Whoop MG has been on a bicep band on the same arm for the past three months. I tracked a full week across both devices from June 17 to June 25, with two nights being an exception where I actually slept without any of the bands because I fell sick. </p><p>Before we dive into the numbers, though, it's worth knowing that since the Fitbit Air was brand new out of the box, it was still building its baseline during the first couple of nights. </p><figure class="van-image-figure  inline-layout" data-bordeaux-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="Cp6RfTemyGYHBGMZgpFN5M" name="awhoop-mg-fitbit-air-1" alt="Google Fitbit Air in the hands of the author" src="https://cdn.mos.cms.futurecdn.net/Cp6RfTemyGYHBGMZgpFN5M.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>It's also worth noting that wearing the Whoop MG on the bicep rather than the wrist does influence readings. Both are valid measurement points, but it's commonly believed that less movement leads to more accurate results. </p><p>The wrist moves around a lot, while the bicep stays relatively still, so the Whoop data could be slightly more accurate because of that, though I can't say for certain. Either way, the Fitbit Air doesn't offer a bicep band yet, so if a bicep option is something you need, the Whoop MG is currently the only choice.</p><h2 id="fitbit-needed-a-few-nights-before-the-data-made-sense">Fitbit needed a few nights before the data made sense</h2><figure class="van-image-figure  inline-layout" data-bordeaux-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="9RQGTxBse9fSaGqQz5GiiL" name="fitbit-air-4" alt="Google Fitbit Air in the hands of the author" src="https://cdn.mos.cms.futurecdn.net/9RQGTxBse9fSaGqQz5GiiL.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>As expected, the Fitbit Air took a couple of days to calibrate to my body and sleep patterns. I wasn't expecting it to agree with the Whoop MG right from the first night, and that was pretty obvious in the data. On day one, there was almost a one-hour difference in total sleep. Fitbit Air logged just 5 hours and 15 minutes of sleep, while the Whoop MG recorded around 6 hours and 15 minutes. </p><p>Thankfully, things improved quickly after that. From the second night onward, the two trackers became much more consistent. On the final two nights of my testing (June 22 and June 25), both devices recorded roughly seven hours of sleep on one night and around seven and a half hours on the other, with only about a 15-minute difference. </p><p>I'd call that accurate enough for tracking total sleep duration. If all you care about is knowing how long you slept, the Fitbit Air becomes much more reliable after a few days of wear. </p><div ><table><caption>Fitbit Air vs Whoop MG </caption><thead><tr><th class="firstcol " ><p>Night</p></th><th  ><p>Whoop MG</p></th><th  ><p>Fitbit Air</p></th><th  ><p>Difference</p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Jun 17<br>(Fitbit calibrating)</p></td><td  ><p>Duration: 6h 15m<br>Deep sleep: 1h 30m<br>REM: 1h 3m</p></td><td  ><p>Duration: 5h 15m<br>Deep sleep: 34 min<br>REM: 1h 14m</p></td><td  ><p>Duration: 60 min<br>Deep sleep: 56 min<br>REM: 11 min</p></td></tr><tr><td class="firstcol " ><p>Jun 18</p></td><td  ><p>Duration: 6h 39m<br>Deep sleep: 58 min<br>REM: 57 min</p></td><td  ><p>Duration: 6h 53m<br>Deep sleep: 44 min<br>REM: 41 min</p></td><td  ><p>Duration: 14 min<br>Deep sleep: 14 min<br>REM: 16 min</p></td></tr><tr><td class="firstcol " ><p>Jun 19</p></td><td  ><p>Duration: 6h 56m<br>Deep sleep: 1h 25m<br>REM: 1h 7m</p></td><td  ><p>Duration: 7h 33m<br>Deep sleep: 1h 10m<br>REM: 1h 17m</p></td><td  ><p>Duration: 37 min<br>Deep sleep: 15 min<br>REM: 10 min</p></td></tr><tr><td class="firstcol " ><p>Jun 22</p></td><td  ><p>Duration: 6h 32m<br>Deep sleep: 1h 14m<br>REM: 1h 10m</p></td><td  ><p>Duration: 6h 48m<br>Deep sleep: 54 min<br>REM: 1h 16m</p></td><td  ><p>Duration: 16 min<br>Deep sleep: 20 min<br>REM: 6 min</p></td></tr><tr><td class="firstcol " ><p>Jun 25</p></td><td  ><p>Duration: 7h 17m<br>Deep sleep: 45 min<br>REM: 1h 11m</p></td><td  ><p>Duration: 7h 34m<br>Deep sleep: 42 min<br>REM: 1h 58m</p></td><td  ><p>Duration: 17 min<br>Deep sleep: 3 min<br>REM: 47 min</p></td></tr></tbody></table></div><p>Sleep stages, though, are a completely different story. Even after a week, both devices continued to disagree quite a bit on deep sleep and REM sleep. You can see from the table above that there are some pretty noticeable differences between the two, despite both devices tracking the exact same nights. </p><p>Which one is actually right? Honestly, it's hard to tell after just a week of testing. A longer testing period might reveal whether the two begin converging over time, but that is something I'll give one or two months to test. </p><p>It's also worth noting that placement could be playing a role here. As I mentioned above, I wore the Whoop MG on my left bicep while the Fitbit Air stayed on my left wrist, and this might have led the trackers to produce slightly different readings. </p><p>One area where the Fitbit Air clearly felt better to me, however, was the representation of the data collected overnight.</p><h2 id="fitbit-s-app-actually-won-me-over">Fitbit's app actually won me over</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bUEQ7ZBJq48hf5cha6TdkW" name="google-fibit-air-screenshot" alt="Sleep tracking on the Google Fitbit Air" src="https://cdn.mos.cms.futurecdn.net/bUEQ7ZBJq48hf5cha6TdkW.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I've said this before, and I'll say it again. While Whoop has become popular with casual users, it's still a product built primarily for athletes. That means the moment you open the app after waking up, you're greeted with a wall of numbers, graphs, and recovery metrics. </p><p>I can't believe I'm saying this, but I actually think Google has done a great job with the <a href="https://www.tomsguide.com/wellness/fitness/the-fitbit-app-is-officially-dead-but-dont-panic-its-replacement-is-even-better">Google Health app</a> that powers the Fitbit Air, even though plenty of Fitbit users might disagree with me.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aRinS32WEMo5G74gWPMBbJ" name="whoop-app-sleep-stats" alt="Sleep stats inside the Whoop app" src="https://cdn.mos.cms.futurecdn.net/aRinS32WEMo5G74gWPMBbJ.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>I don't want to wake up and immediately analyze a dashboard full of metrics. Instead, Fitbit Air gives me a quick summary of how I slept, and for most mornings, that's all I need to know whether I had a good night's sleep or not. I also like that I can tell the app when I don't agree with how I'm feeling, rather than blindly accepting the data. </p><p>One thing I also noticed during my testing was how much faster Fitbit Air processes sleep data. Most mornings, it gave me my sleep summary within five to seven minutes of waking up. </p><p>The Whoop app, on the other hand, often took much longer. There were days when I didn't get my sleep report for nearly 30 minutes, and sometimes I even had to manually end the sleep session before it would process the data. </p><h2 id="verdict">Verdict</h2><figure class="van-image-figure  inline-layout" data-bordeaux-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="9YLsF7HXdWUUN3ENeQckxL" name="fitbit-air-2" alt="Google Fitbit Air in the hands of the author" src="https://cdn.mos.cms.futurecdn.net/9YLsF7HXdWUUN3ENeQckxL.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Overall, I still think the Fitbit Air offers a better experience for the average user. Sure, the data differed from Whoop, but that's true of almost every consumer sleep tracker. None of these devices are clinical-grade after all.</p><p>After a week of wearing both trackers, I don't think sleep tracking alone is a good enough reason to spend significantly more on a Whoop. Once the Fitbit Air had a few nights to calibrate, its total sleep tracking was consistently close enough that I stopped paying attention to the differences.</p><p>What you're really paying the Whoop premium for isn't better sleep tracking. It has other features as well, like ECG, blood pressure insights, strain tracking, and a whole recovery ecosystem built for athletes. If those features matter to you, the subscription makes sense.</p><p>But if your main priority is simply understanding how well you slept each night, I honestly think the $100 Fitbit Air gets you most of the way there, with a friendlier app experience <em>and</em> for a fraction of the yearly cost.</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/wellness/sleep-tech/apple-watch-vs-whoop-mg-sleep-tracker-comparison">I used the Apple Watch and Whoop to track my sleep for a year — there's a clear winner for me</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-3-500-steps-with-the-fitbit-air-vs-fitbit-inspire-3-and-theres-a-clear-winner">I walked 3,500 steps with the Fitbit Air vs Fitbit Inspire 3 — and there's a clear winner</a></li><li><a href="https://www.tomsguide.com/audio/airpods/forget-the-apple-watch-i-use-airpods-pro-3-for-live-heart-rate-tracking-while-running-and-theyre-usd70-off-right-now">Forget the Apple Watch: I use AirPods Pro 3 for Live Heart Rate Tracking while running</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'm a smartwatch reviewer, and here's my Apple Watch Series 12 wish list — three upgrades I want, and one I don't ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/im-a-smartwatch-reviewer-and-heres-my-apple-watch-series-12-wish-list-three-upgrades-i-want-and-one-i-dont</link>
                                                                            <description>
                            <![CDATA[ The Apple Watch 12 will be here before we know it, and with no shortage of rumors, here's what I really want (and don't) from Cupertino's next wearable. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gHdTugRTA6kikcESZF76Bc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/r2c2FfYmhRm6nb3DhTmXf6-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Jul 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/r2c2FfYmhRm6nb3DhTmXf6-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the Apple Watch 11 on a user&#039;s wrist against a blue background with the app icon grid displayed on the screen]]></media:description>                                                            <media:text><![CDATA[Close-up of the Apple Watch 11 on a user&#039;s wrist against a blue background with the app icon grid displayed on the screen]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the Apple Watch 11 on a user&#039;s wrist against a blue background with the app icon grid displayed on the screen]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/r2c2FfYmhRm6nb3DhTmXf6-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>July officially kicks off what I like to call “the summer of smartwatch launches.” Samsung tends to get things started with a new slate of Galaxy Watches toward the end of the month, then Google answers with fresh Pixel Watches sometime in August, before Apple closes things out in early September with the latest Apple Watch debuts.</p><p>This schedule is, of course, not set in stone, but based on the recent past, it seems likely that the summer of 2026 will look a lot like 2025 and 2024, in terms of launch timing. </p><p>While an <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Apple Watch Ultra 4</a> and/or a replacement for the budget-friendly <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-se-3-review">Apple Watch SE 3</a> are far from certain, we’ll almost certainly lay eyes on the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch Series 12</a> in just over two months. After all, Cupertino has shown off a new flagship Apple Watch series every single year for the past 11 straight years. </p><p>As a smartwatch reviewer with no shortage of Apple Watch 12 rumors to go off of, these are the three upgrades — that actually have a chance of coming to fruition — I’m hoping for most, plus one I desperately don’t want to happen. </p><h3 class="article-body__section" id="section-apple-watch-12-upgrade-no-1-touch-id"><span>Apple Watch 12 upgrade no.1: Touch ID</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:2062px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="VQiFKUFBcwN2w6cwrxKf6g" name="dji_mimo_20250909_145436_20250909145437_1757471916075_photo" alt="Apple Watch Series 11" src="https://cdn.mos.cms.futurecdn.net/VQiFKUFBcwN2w6cwrxKf6g.jpg" mos="" align="middle" fullscreen="" width="2062" height="1160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Punching in a passcode on the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch 11</a>’s modest-sized display is a pain in the butt, which is why I keep the security feature turned off, even though I know better. One way to improve things? Add Touch ID support. </p><p>Not only would Touch ID make unlocking the smartwatch a breeze, but it could also be used to confirm purchases via Apple Pay and/or app downloads. </p><p>According to a report in <a href="https://www.macworld.com/article/2881882/apple-code-suggests-touch-id-could-be-coming-to-apple-watch.html" target="_blank">Macworld</a>, Touch ID on the Apple Watch Series 12 is a real possibility. Then again, separate leaks suggest that <a href="https://www.tomsguide.com/news/future-apple-watch-could-have-a-built-in-camera">Face ID</a> could also be in the cards. Both of these upgrades would require additional onboard hardware, in the form of either an under-the-display fingerprint scanner or front-facing camera. I'd ultimately be pleased with either. </p><h3 class="article-body__section" id="section-apple-watch-12-upgrade-no-2-a-brighter-display"><span>Apple Watch 12 upgrade no.2: A brighter 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:3531px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Zs7qnYWGznsw6CVSVk22sX" name="AppleWatch-2025-07" alt="Apple Watch Series 11 close-up" src="https://cdn.mos.cms.futurecdn.net/Zs7qnYWGznsw6CVSVk22sX.jpg" mos="" align="middle" fullscreen="" width="3531" height="1986" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Apple Watch Series 11 display maxes out at a respectable 2,000 nits of brightness, which is enough output to view the screen in most lighting conditions. However, both the <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-went-hands-on-with-google-pixel-watch-4-and-it-could-be-my-new-favorite-smartwatch-for-android">Google Pixel Watch 4</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Samsung Galaxy Watch 8</a> boast displays with 3,000 nits of max brightness, and their successors might push that output even further.</p><p>To both stay competitive and to ensure optimal viewability, even when lounging on white sand beaches under clear blue skies, I’m hoping the Series 12 at least matches the screen brightness of the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 3</a> and the above-mentioned watches, 3,000 nits. </p><h3 class="article-body__section" id="section-apple-watch-12-upgrade-no-3-ai-powered-siri"><span>Apple Watch 12 upgrade no.3: AI-powered Siri</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="93MvZFxy3GtR4RQnoqhbah" name="AppleWatchSiri" alt="Person wearing Apple Watch activating Siri" src="https://cdn.mos.cms.futurecdn.net/93MvZFxy3GtR4RQnoqhbah.jpg" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Wachiwit / Getty Images)</span></figcaption></figure><p>It’s not even close: Google’s Gemini AI voice assistant for Pixel Watches and select Samsung Galaxy Watches is a zillion times better than the same-old Siri that’s been offered in every Apple Watch for more than a decade.</p><p>When I <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-went-hands-on-with-google-pixel-watch-4-and-it-could-be-my-new-favorite-smartwatch-for-android#section-google-pixel-watch-4-gemini-and-gesture-controls">reviewed the Pixel Watch 4</a>, I was genuinely impressed by the onboard AI assistant’s ability to answer genuinely complex questions with helpful, accurate replies. </p><p>Of course, we know Apple has <a href="https://www.tomsguide.com/ai/apple-intelligence/the-new-siri-is-a-make-or-break-moment-for-apple-at-wwdc-heres-why">partnered with Google</a> to power Siri 2.0 with Gemini, and we've already had a taste of what that <a href="https://www.tomsguide.com/phones/iphones/i-spent-a-week-with-siri-ai-here-are-my-honest-pros-and-cons">looks like on iPhone</a>. The question is, will this be ready in time for the fall? I sure hope so, particularly if it debuts alongside a new dedicated gesture control to wake it, similar to Google's "raise to wake" gesture for Pixel Watch 4. </p><h3 class="article-body__section" id="section-apple-watch-12-what-i-don-t-want-a-redesigned-band-system"><span>Apple Watch 12 — what I don’t want: A redesigned band system</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:970px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="5UZmFrXnmYtGfpn3thBJUh" name="Apple Watch with bands" alt="Apple Watch with bands" src="https://cdn.mos.cms.futurecdn.net/5UZmFrXnmYtGfpn3thBJUh.png" mos="" align="middle" fullscreen="" width="970" height="546" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One Apple Watch 12 “upgrade” rumor I’m hoping doesn’t come to pass, though it's been widely reported on, is a redesigned case with a new system for attaching straps. Apple has used the same band system ever since the original Apple Watch debuted. </p><p>One of the nicest things about upgrading from an older Apple Watch to a newer model is the ability to bring your band along with you, assuming you're sticking with a similar case size. </p><p>For example, I’ve got four or five <a href="https://www.tomsguide.com/wellness/smartwatches/i-review-apple-watches-for-a-living-and-this-is-my-all-time-favorite-strap">favorite Apple Watch bands</a>, and I’d be seriously annoyed if none of them worked on the Series 12. </p><h3 class="article-body__section" id="section-apple-watch-series-12-what-do-you-want"><span>Apple Watch Series 12: What do you want? </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:3066px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="wFrwtxB59iwVBRXoDsAHSA" name="fav-AW-apps" alt="Close up of the Apple Watch 11 on a user's wrist with the app icon screen displayed" src="https://cdn.mos.cms.futurecdn.net/wFrwtxB59iwVBRXoDsAHSA.jpg" mos="" align="middle" fullscreen="" width="3066" height="1725" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>So, now that you know my three biggest Apple Watch Series 12 wishes, I’m curious to hear your thoughts. What are you most hoping to see in the next flagship Apple Watch model? Let me know in the comments or survey below. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xpox4O"></div>                            </div>                            <script src="https://kwizly.com/embed/Xpox4O.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/your-samsung-galaxy-watch-now-supports-blood-pressure-tracking-but-its-not-the-same-as-apples-hypertension-alerts">Your Samsung Galaxy Watch now supports blood pressure tracking — but it’s not the same as Apple’s Hypertension Alerts</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/take-off-that-apple-watch-5-reasons-why-its-okay-to-swap-your-smartwatch-for-a-dumb-watch">5 reasons why I sometimes still wear a 'dumb' watch</a></li><li><a href="https://www.tomsguide.com/computing/vr-ar/snapdragon-reality-elite-is-here-and-ive-already-tested-it-without-realizing-in-xreals-project-aura-its-a-giant-step-towards-the-future-of-smart-glasses">Snapdragon Reality Elite is here, and I’ve already tested it without realizing in Xreal’s Project Aura — its a giant step towards the future of smart glasses</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Leaked Apple Watch 12 design change is the opposite of an upgrade — and that has me worried ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/leaked-apple-watch-12-design-change-is-the-opposite-of-an-upgrade-and-that-has-me-worried</link>
                                                                            <description>
                            <![CDATA[ Cupertino has stuck with the same band attachment system since the first Apple Watch debuted. Now is not the time to switch it. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qJnWqVmazF8d56ddpT8gc4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5UZmFrXnmYtGfpn3thBJUh-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 23:52:53 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/png" url="https://cdn.mos.cms.futurecdn.net/5UZmFrXnmYtGfpn3thBJUh-1280-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple Watch with bands]]></media:description>                                                            <media:text><![CDATA[Apple Watch with bands]]></media:text>
                                <media:title type="plain"><![CDATA[Apple Watch with bands]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5UZmFrXnmYtGfpn3thBJUh-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Apple Watch rumors are a dime a dozen, so getting bent out of shape about one in particular isn’t advisable. Then again, the vast majority of Apple Watch leaks suggest positive improvements to Cupertino’s range of wearables, not potentially negative changes.</p><p>This is why one particular <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-12-everything-we-know-so-far">Apple Watch 12 rumor</a> has me a bit, shall we say, perturbed, particularly as someone who’s invested heavily over the years in accessories for the <a href="https://www.tomsguide.com/best-picks/best-apple-watch">best Apple Watch</a> models, namely, a large collection of Apple Watch straps.</p><h2 id="a-new-case-design-could-mark-the-end-of-an-era">A new case design could mark the end of an era</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3744px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gpP8cwF2f8qXFZuC8Fb64T" name="Series11-sensor" alt="Close-up of the rear sensor array on the Apple Watch Series 11" src="https://cdn.mos.cms.futurecdn.net/gpP8cwF2f8qXFZuC8Fb64T.jpg" mos="" align="middle" fullscreen="" width="3744" height="2106" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Ever since the first Apple Watch launched over a decade ago, Apple has consistently used the same strap attachment system. Sure, it's proprietary, and an old-fashioned spring bar works just as well, but now, nearly eleven years later, many of us have acquired a sizable array of compatible bands.</p><p>I know I have my <a href="https://www.tomsguide.com/wellness/smartwatches/i-review-apple-watches-for-a-living-and-this-is-my-all-time-favorite-strap">favorite Apple Watch straps</a>, which I frequently shift between the Apple Watch <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Series 11</a>, <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-se-3-review">SE 3</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Ultra 3</a>, depending on what I’m testing/writing about (I’m quite partial to the Nike Sport Loop).</p><p>Well, if a recent report from the known leaker <a href="https://www.weibo.com/5143897135/R6w0GFORh">Instant Digital</a> proves to be true, Apple could be moving away from the strap attachment system we’ve all come to know and, well, tolerate. Such a move would surely irritate Apple Watch owners everywhere, myself included.</p><h2 id="apple-is-already-in-hot-water-with-some-smartwatch-owners">Apple is already in hot water with some smartwatch owners</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1929px;"><p class="vanilla-image-block" style="padding-top:56.19%;"><img id="fVx5Kn8PkKaDbr3GegBTN9" name="watchOS27-dynamic" alt="The new Dynamic App Grid available in watchOS 27" src="https://cdn.mos.cms.futurecdn.net/fVx5Kn8PkKaDbr3GegBTN9.jpg" mos="" align="middle" fullscreen="" width="1929" height="1084" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>With the recent debut of <a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year">watchOS 27</a> beta, Cupertino has already thoroughly irked a wide swath of the Apple Watch faithful. Why? The next-gen operating system for the watch — which fully launches this fall — will only support the very latest Apple Watch models.</p><p>That list includes the Series 11, Series 10, Series 9, Ultra 3, Ultra 2, and SE 3. Basically, unless you purchased your Apple Watch in the past two to three years, you’re out of luck, software-wise. </p><p>Now owners of the<a href="https://www.tomsguide.com/reviews/apple-watch-series-8"> Series 8</a>, <a href="https://www.tomsguide.com/reviews/apple-watch-se-2022">SE 2</a>, <a href="https://www.tomsguide.com/reviews/apple-watch-ultra-review">Ultra</a>, etc., have to decide whether to upgrade to a newer Apple Watch model or bail on the form-factor/move to a competitor like Garmin. What better way to convince them to stay than by making their existing collection of straps obsolete? Heck, Apple might as well introduce a newer charger while it's at it (Dear Apple: Please, don't). </p><p>What are your thoughts on Apple potentially switching to a new band attachment system for the Apple Watch Series 12 or <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Ultra 4</a>? Let me know in the comments below. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Apple Watch Ultra 4: All the design, health, and battery life rumors so far</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/the-end-of-an-era-apple-is-quietly-ditching-one-of-its-iconic-apple-watch-features-with-watchos-27">The end of an era: Apple is quietly ditching one of its iconic Apple Watch features with watchOS 27</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-tested-the-usd79-amazfit-bip-6-vs-the-usd249-apple-watch-se-3-and-the-cheaper-smartwatch-is-a-lot-better-than-i-thought">I tested the $79 Amazfit Bip 6 vs the $249 Apple Watch SE 3 — and the cheaper smartwatch is a lot better than I thought</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I use this hidden Garmin feature on all of my long runs: Here's how to find it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/i-use-this-hidden-garmin-feature-on-all-of-my-long-runs-heres-how-to-find-it</link>
                                                                            <description>
                            <![CDATA[ This is my favorite feature to use when marathon training or running somewhere new. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">HttxafN9N47s3g7KAvfJ7L</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/uAikzDHFYHa95RMmVG2kwb-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &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/uAikzDHFYHa95RMmVG2kwb-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin&#039;s Turn Around feature ]]></media:description>                                                            <media:text><![CDATA[Garmin&#039;s Turn Around feature ]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin&#039;s Turn Around feature ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/uAikzDHFYHa95RMmVG2kwb-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There’s no doubt about it: Garmin makes some of the<a href="https://www.tomsguide.com/best-picks/best-running-watches"> best running watches</a> on the market, but they’re <em>really </em>good at hiding some of the watch's best features. Whichever model you choose, I’d estimate you’re still probably only using about 15% of the tools on board. </p><p>I’m here to change this with simple tips and tricks to help you get the most out of your tech (check out how to use <a href="https://www.tomsguide.com/news/how-to-use-the-garmin-body-battery-function">Garmin’s Body Battery feature</a> and <a href="https://www.tomsguide.com/how-to/how-to-use-the-hrv-status-feature-on-your-garmin-watch">HRV status</a> here). </p><p>One feature I use <em>all </em>the time on my long marathon training runs, where I lose the will to live, to plot complicated routes and just head to the Thames Path, turning around at the halfway point, and whenever I’m running anywhere new, is the Turn Around alert. </p><p>Read on to find out how to use this hidden but helpful tool.</p><h3 class="article-body__section" id="section-how-to-use-the-garmin-turn-around-alert"><span>How to use the Garmin Turn Around alert </span></h3><p>Garmin’s Turn Around Alert is exactly what it sounds like. It’s an out-and-back navigation feature that will notify you when you reach the halfway point of your planned run, whether that be time or distance. </p><p>As mentioned above, I typically head out to follow the River Thames for my long marathon training runs and will simply turn around when I reach the halfway point. This might be mind-numbing for some, but it saves me having to plot complicated routes and lets me focus on my run.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3230px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GsJArheJDcxczuStGWjHxb" name="Garmin Forerunner 70" alt="Garmin's Turn Around feature" src="https://cdn.mos.cms.futurecdn.net/GsJArheJDcxczuStGWjHxb.jpg" mos="" align="middle" fullscreen="" width="3230" height="1817" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This alert works on most Garmin watches, including the current Forerunner lineup of the <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-forerunner-70-review">Forerunner 70</a>, <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-forerunner-170-review-an-affordable-and-accurate-running-watch">Forerunner 170</a>, <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-forerunner-570-review">Forerunner 570</a>, and <a href="https://www.tomsguide.com/wellness/smartwatches/garmin-forerunner-970-review-my-new-favorite-sports-watch">Forerunner 970</a>. Here’s how to set up the alert. </p><section class="howto-block">                    <h3>How to set up the Garmin Turn Around feature</h3>                                        <p><ul><li>Head to <strong>Run</strong> on your Garmin</li><li>Scroll down to <strong>Run Settings</strong></li><li>Select <strong>Alerts</strong></li><li>Click <strong>Add New</strong></li><li>Then <strong>Custom</strong></li><li>Scroll down to <strong>Turn Around </strong></li><li>You can then choose whether the alert goes off after a certain period of time or halfway through your run’s total distance. </li><li><strong>Input the total duration or distance</strong> of your run, and your watch will send a Turn Around alert when you reach halfway.</li></ul></p>                </section><p>If you’re running somewhere new and don’t have the time to sit and plot a new route, this alert allows you to lace up and start running, then turn around and finish exactly where you started. </p><p>Be sure to keep an eye on Tom’s Guide for more Garmin tips and tricks. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODnELe"></div>                            </div>                            <script src="https://kwizly.com/embed/ODnELe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Apple Watch Ultra 4: All the design, health, and battery life rumors so far</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-500-steps-with-the-fitbit-air-vs-apple-watch-se-3-and-im-surprised-by-the-winner">I walked 4,500 steps with the Fitbit Air vs Apple Watch SE 3 — and I'm surprised by the winner</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-tested-the-usd79-amazfit-bip-6-vs-the-usd249-apple-watch-se-3-and-the-cheaper-smartwatch-is-a-lot-better-than-i-thought">I tested the $79 Amazfit Bip 6 vs the $249 Apple Watch SE 3 — and the cheaper smartwatch is a lot better than I thought</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Exclusive: Google design director says Fitbit Air reception proves they 'made the right decision' going screen-free ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/exclusive-google-design-director-says-fitbit-air-reception-proves-they-made-the-right-decision-going-screen-free</link>
                                                                            <description>
                            <![CDATA[ I spoke to the lead designer behind the Fitbit Air to learn more about Google’s new $99 tracker and to determine if the Fitbit brand is actually here to stay. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">FMBWthhcB3yswm44bNJRsE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UDs8Ptawp2Ta84dW6N8vJD-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 02 Jul 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/UDs8Ptawp2Ta84dW6N8vJD-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Close-up of the sensors on the underside of the Fitbit Air fitness tracker]]></media:description>                                                            <media:text><![CDATA[Close-up of the sensors on the underside of the Fitbit Air fitness tracker]]></media:text>
                                <media:title type="plain"><![CDATA[Close-up of the sensors on the underside of the Fitbit Air fitness tracker]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UDs8Ptawp2Ta84dW6N8vJD-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I must admit, as a wearable tech writer, I predicted that Fitbit would <a href="https://www.tomsguide.com/wellness/fitness-trackers/google-just-killed-another-fitbit-feature-and-now-im-certain-the-brand-is-as-good-as-dead">die under Google</a>, which acquired the brand in 2021. I was wrong.</p><p>So, when the opportunity arose to sit down and chat with Jonah Becker  — design director for wearables at Google — about the recently debuted <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a>, I was a tad embarrassed. Fortunately, Jonah didn’t take my doomsday predictions personally, which is a relief given he’s been working on Fitbit products for over a decade.</p><p>Jonah started at Fitbit in 2016 and moved over to Google during the <a href="https://www.tomsguide.com/news/google-acquires-fitbit-for-21-billion">2021 acquisition</a>. He currently leads the industrial design teams behind the Pixel Watch, Pixel Buds, and, of course, Fitbit. </p><p>Our chat touched on the inspiration and design process behind the Fitbit Air (i.e., one of the <a href="https://www.tomsguide.com/us/best-fitness-trackers,review-2066.html">best fitness trackers</a> in 2026), the reason it doesn’t have onboard GPS, and the possibility of other Google-built screen-free wearables. I also got his candid thoughts on the outcome of the Google x Fitbit acquisition, five years on. </p><h3 class="article-body__section" id="section-inspired-by-his-children-s-friendship-bracelets"><span>Inspired by his children's friendship bracelets</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:4923px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="v4R3RdVkt2tearzZXDp52N" name="FitbitAir-rev-07" alt="Close-up of the Fitbit Air on a person's wrist" src="https://cdn.mos.cms.futurecdn.net/v4R3RdVkt2tearzZXDp52N.jpg" mos="" align="middle" fullscreen="" width="4923" height="2769" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><div><blockquote><p>"The inspiration we had from the start was the friendship bracelet."</p></blockquote></div><p>The Fitbit Air is a $99 screen- and button-free fitness tracker that doesn’t require a subscription and works with both Android and iOS devices. Incredibly lightweight and comfortable, it barely even looks like a piece of wearable tech, and that’s the point. </p><p>“The inspiration we had from the start was the friendship bracelet — the idea that you have this thing that is super lightweight, comfortable —  it's not a typical fitness watch or fitness tracker,” says Becker. It’s “something that has a more casual, all-hours-in-the-day vibe. I would see my kids at summer camp; they'd put on a friendship bracelet and wear it for months on end until basically the threads went bare and they fell off.”</p><p>The beauty of the Fitbit Air is that all of the tracking technology is condensed into a small, bean-like object that can easily be popped in and out of bands for maximum customization. Google even released a hardware development kit allowing DIYers to design and 3D-print their own bands for the Air. </p><p>“There are a lot of creative people in the world who have unique situations, and the idea that it becomes something that people can have fun with," says Becker on the subject of creating your own straps for the Air. "You know, as long as it's working in a way that it's supporting their health, that's what's most important.”</p><h3 class="article-body__section" id="section-a-whoop-alternative-for-you-and-me"><span>A Whoop alternative for you and me</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:4805px;"><p class="vanilla-image-block" style="padding-top:50.01%;"><img id="wNxwSP3oTrgcw3KuNCjzw" name="Fitbit-Air-lead-05-header" alt="Close-up of the Fitbit Air on-wrist on a red strap against a blue background" src="https://cdn.mos.cms.futurecdn.net/wNxwSP3oTrgcw3KuNCjzw.jpg" mos="" align="middle" fullscreen="" width="4805" height="2403" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><div><blockquote><p>"I see it as sort of the archetype of the ambient fitness tracker. We have so many devices around us demanding our attention all the time, and at the same time, health is every hour of every day, seven days a week."</p></blockquote></div><p>Of course, the Fitbit Air is far from the only screen-free fitness tracker out there. Its primary competition is the <a href="https://www.tomsguide.com/wellness/fitness-trackers/whoop-5-0-review-should-you-give-a-whoop-about-this-new-tracker">Whoop 5.0</a>, a subscription-based tracker that’s big on heady training stats and recovery insights. Perfect for hardcore athletes and pros, the Fitbit Air is essentially the exact opposite. </p><p>While Whoop-wearers are less likely to need daily motivation to work out, the rest of us, well, could probably benefit from it.</p><p>"You have your high-tier athletes, and then you have like the other 99.7% of the population. There are a lot of people who don't have that motivation and guidance. So for me, it's like, that's where the real opportunity is, this broad population health."</p><p>As I noted in my <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">review of the Fitbit Air</a>, the device is basically a “Whoop alternative for the rest of us.” And after chatting with Becker, it seems that was the intention behind its development. </p><p>"I see [the Fitbit Air] as sort of the archetype of the ambient fitness tracker, the displayless tracker that's not demanding your attention. We have so many devices around us demanding our attention all the time, and at the same time, health is every hour of every day, seven days a week." </p><h3 class="article-body__section" id="section-no-gps-no-problem-for-most-people"><span>No GPS, no problem... for most people</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:4654px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3ZgyaboUC5K2rnhcC6Kifi" name="Inspire3-v-Air-02" alt="Close-up of the Fitbit Inspire 3 next to the Fitbit Air on a user's wrist" src="https://cdn.mos.cms.futurecdn.net/3ZgyaboUC5K2rnhcC6Kifi.jpg" mos="" align="middle" fullscreen="" width="4654" height="2618" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><div><blockquote><p>“The reality is that like 99% of people who might want to track a run or a hike or something like that are going to have their phones with them."</p></blockquote></div><p>It's worth noting that the Fitbit Air lacks onboard GPS, something I critiqued in the review, but why? According to Becker, the size, cost, and battery implications of including GPS didn’t align with the overall design intent of the Air. </p><p>Moreover, “the reality is that like 99% of people who might want to track a run or a hike or something like that are going to have their phones with them. So, having the paired GPS with the phone is going to provide a great experience,” adds Becker. </p><h3 class="article-body__section" id="section-on-the-longterm-outcome-of-google-s-fitbit-acquisition"><span>On the longterm outcome of Google’s Fitbit acquisition </span></h3><div><blockquote><p>"To launch [the Fitbit Air] now feels in many ways like the first big move in delivering upon the promise of the [Google] acquisition."</p></blockquote></div><p>Becker has the unique perspective of working on the Fitbit brand both when it was a standalone company and under Google. And much to my surprise, he revealed that Fitbit Air has been under development since shortly after the acquisition in 2021. That's a long time! </p><p>“To launch [the Fitbit Air] now feels in many ways like the first big move in delivering upon the promise of the acquisition,” admits Becker. </p><p>“I think one of the great things about Fitbit becoming part of Google is that Fitbit brings a ton of health expertise, history, brand recognition, and many years — a decade plus — of data collection, so an understanding of people's biometrics and behaviors,” says Becker. “And Google is a company that can probably do the best job in the world of making sense of all that data, and I think that's what it's really unlocked.”</p><h3 class="article-body__section" id="section-what-s-next-for-fitbit"><span>What’s next for Fitbit? </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="ktst4G4aEo3tp2SAEDwt7A" name="FitbitAir-01" alt="Hands-on with the Fitbit Air on the orange and brown Stephen Curry strap" src="https://cdn.mos.cms.futurecdn.net/ktst4G4aEo3tp2SAEDwt7A.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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><div><blockquote><p>"I think we are seeing a really great reception to Fitbit Air, so it gives us confidence that we made the right decision in pursuing a screen-free form factor."</p></blockquote></div><p>All of this begs the question: Is the Fitbit brand <em>actually</em> here to stay? When I asked Becker, he was coy, but I picked up on a glimmer of excitement. So, I pushed further. "With word of a <a href="https://www.tomsguide.com/wellness/smart-rings/samsung-confirms-galaxy-ring-2-is-coming-and-it-might-even-work-with-ios">Samsung Galaxy Ring 2</a> under development, might we expect other screen-free wearables from Google in the near future?" I asked. </p><p>“I think we are seeing a really great reception to Fitbit Air, so it gives us confidence that we made the right decision in pursuing a screen-free form factor, and I, and I'll have to leave it at that.” </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/wellness/fitness-trackers/fitbit-air-performance-issues-3-ways-to-make-sure-the-fitbit-air-accurately-tracks-your-next-workout">Fitbit Air performance issues? 3 ways to make sure the Fitbit Air accurately tracks your next workout</a></li><li><a href="https://www.tomsguide.com/wellness/fitness/an-iphone-moment-for-your-eyes-why-xpanceo-is-betting-big-on-smart-contact-lenses-as-the-future-of-ar">An ‘iPhone moment’ for your eyes — why Xpanceo is betting big on smart contact lenses as the future of AR</a></li><li><a href="https://www.tomsguide.com/wellness/fitness/i-went-to-sweden-to-watch-bike-helmets-get-smashed-into-anvils-3-things-i-learned-at-the-mips-test-lab">I went to Sweden to watch bike helmets get smashed into anvils — 3 things I learned at the MIPS test lab</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The end of an era: Apple is quietly ditching one of its iconic Apple Watch features with watchOS 27 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/the-end-of-an-era-apple-is-quietly-ditching-one-of-its-iconic-apple-watch-features-with-watchos-27</link>
                                                                            <description>
                            <![CDATA[ Warning: this will make you feel nostalgic ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xQvHoiUfuwVjwMd5mxa7aH</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/zBpQeUFsXycFDPSqpVT5eY-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 01 Jul 2026 11:02:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ jane.mcguire@futurenet.com (Jane McGuire) ]]></author>                    <dc:creator><![CDATA[ Jane McGuire ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/vV4Uj3e5TZvBqmmsjT2EU6.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jane McGuire is Tom&#039;s Guide&#039;s Fitness Managing Editor, which means she looks after everything fitness-related — from running gear and fitness trackers to yoga mats and sports bras. An avid runner, Jane has tested and reviewed fitness products for the past five years, so she knows what to look for when finding a good running watch or a pair of shorts with pockets big enough for your smartphone, running gels, and house keys. &lt;/p&gt;&lt;p&gt;Jane has run six marathons — the London Marathon five times, and the Berlin Marathon once -and is still on a quest to tick off all of the marathon majors. Her marathon PR is 3:30, which she ran in the New Balance Supercomp Elite V5&#039;s, but she also spends a lot of time talking about her  ‘joy plan’, where she runs for happiness, not for PR’s. &lt;/p&gt;&lt;p&gt;Previous to Tom’s Guide, Jane worked for Runner’s World, where she co-hosted the Runner’s World podcast. She also presents on a YouTube channel called the Run Testers, alongside other running-mad journalists, where they review the latest shoes, kit, and tech. Her work has also appeared in Coach, Get Sweat Go, and Women’s Health. &lt;/p&gt;&lt;p&gt;When she&#039;s not pounding the pavements, you&#039;ll find Jane striding round the Surrey Hills, taking far too many photos of her spaniel, Toby. &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/zBpQeUFsXycFDPSqpVT5eY-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[apple watch 11 walkie talkie app]]></media:description>                                                            <media:text><![CDATA[apple watch 11 walkie talkie app]]></media:text>
                                <media:title type="plain"><![CDATA[apple watch 11 walkie talkie app]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/zBpQeUFsXycFDPSqpVT5eY-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Cast your mind back to 2018. The world was pre-COVID, offices were things we actually went to, and I sat on a health desk not all too dissimilar to the one I’m at now, surrounded by colleagues dressed head to toe in athleisurewear. Naturally, we spent our entire day frantically Walkie-Talkie-ing each other from our <a href="https://www.tomsguide.com/best-picks/best-apple-watch">Apple Watches</a> like we were Navy SEALs on a high-stakes tactical mission, rather than people just asking who wanted a coffee. </p><p>The Walkie Talkie feature on the Apple Watch is one of the things I was most excited about when I unboxed my first watch. And while it’s a feature I barely ever touch eight years later, I’m nostalgic for this far simpler time, and bummed that Apple is killing off the Walkie Talkie with <a href="https://www.tomsguide.com/wellness/smartwatches/watchos-27-all-the-new-features-coming-to-apple-watch-later-this-year">watchOS 27</a>. </p><h2 id="end-of-an-era-over">End of an era. Over. </h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3460px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="Dt5WPXxmWSK9Gffs9AbNB9" name="IMG_9699" alt="apple watch walkie talkie feature" src="https://cdn.mos.cms.futurecdn.net/Dt5WPXxmWSK9Gffs9AbNB9.jpg" mos="" align="middle" fullscreen="" width="3460" height="1946" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Sure, it was a feature that rarely worked all that well, but it was still pretty neat. One Reddit user compared the removal of Walkie Talkie to Blockbuster shutting down, and I feel the same — it’s not really going to change my life, but I feel sad all the same. </p><p>The first developer beta of watchOS 27, which will roll out this fall, shows that the Walkie Talkie app has disappeared from both the app list and control center. Walkie Talkie launched with watchOS 5 back in 2018, and allowed users to send push-to-talk voice messages to one another over Wi-Fi or cellular. Unlike Walkie Talkies you played with at school, there was no distance limitations to the feature. </p><p>The app’s removal hasn’t been officially confirmed by Apple, but users running the first watchOS 27 beta have reported that Walkie Talkie is nowhere to be found, and there is no option to redownload it.</p><p>Of course, this might change before watchOS 27 officially launches later this year, but seeing as though Apple haven’t really touched the feature since watchOS 5, it seems more likely that this is just one that will quietly be removed. Over and out, Walkie Talkie, thanks for the memories. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ODnELe"></div>                            </div>                            <script src="https://kwizly.com/embed/ODnELe.js" async></script><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-all-the-design-health-and-battery-life-rumors-so-far">Apple Watch Ultra 4: All the design, health, and battery life rumors so far</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-walked-4-500-steps-with-the-fitbit-air-vs-apple-watch-se-3-and-im-surprised-by-the-winner">I walked 4,500 steps with the Fitbit Air vs Apple Watch SE 3 — and I'm surprised by the winner</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/i-tested-the-usd79-amazfit-bip-6-vs-the-usd249-apple-watch-se-3-and-the-cheaper-smartwatch-is-a-lot-better-than-i-thought">I tested the $79 Amazfit Bip 6 vs the $249 Apple Watch SE 3 — and the cheaper smartwatch is a lot better than I thought</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Watch Ultra 2 rumors — here's everything we expect from Samsung's next-gen rugged smartwatch ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-2-rumors-heres-everything-we-expect-from-samsungs-next-gen-rugged-smartwatch</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Watch Ultra 2 is rumored to feature one massive upgrade that pretty much everyone has been asking for. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fcpcLqH2vykgzXw2pLUQLn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FsCoTmZ6WXwagLctb8znFJ-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 30 Jun 2026 10:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/png" url="https://cdn.mos.cms.futurecdn.net/FsCoTmZ6WXwagLctb8znFJ-1280-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Watch Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Watch Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Watch Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FsCoTmZ6WXwagLctb8znFJ-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Samsung Galaxy Watch Ultra</a> is one of the <a href="https://www.tomsguide.com/best-picks/best-smartwatches-android">best smartwatches for Android</a>, but it's nearly two years old. Will 2026 deliver a replacement? Leaks and rumors suggest the answer is yes. In fact, the Samsung Galaxy Watch Ultra 2 could arrive as soon as the end of July. </p><p>As TG's resident smartwatch expert, I've sifted through all the Galaxy Watch Ultra 2 gossip and insider reports so far so that you don't have to. Here's what you can likely expect from the Galaxy Watch Ultra 2, from cost to features, design tweaks to battery life. </p><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-price-and-launch-predictions"><span>Samsung Galaxy Watch Ultra 2: Price and launch predictions</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:4000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9zzwjiKsbFR9ouPZufsu6C" name="GalaxyWatchUltra.jpg" alt="A close up of the Samsung Galaxy Ultra watch face showing correct alignment with the bezel markings" src="https://cdn.mos.cms.futurecdn.net/9zzwjiKsbFR9ouPZufsu6C.jpg" mos="" align="middle" fullscreen="" width="4000" height="2250" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Samsung tends to hold a "Galaxy Unpacked" launch event annually toward the end of July, and this year should be no different. In terms of wearables, I expect to see a <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-9-and-ultra-2-rumors-everything-weve-heard-so-far">Galaxy Watch 9</a> and Galaxy Watch Ultra 2 debut; a <a href="https://www.tomsguide.com/wellness/fitness-trackers/samsung-galaxy-ring-2">Galaxy Ring 2</a> seems much less certain.</p><p>The Galaxy Watch Ultra launched in late summer 2024 for $649, which is $159 less than the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-3-review">Apple Watch Ultra 2/3</a>. However, the Galaxy Watch Ultra frequently goes on sale for $100 off or more. </p><p>I expect the Galaxy Watch Ultra 2 to either cost the same as its predecessor, $649, or see a modest price increase of $50. Might it see a greater hike than that? With all this talk of inflation, it's possible. However, it seems highly unlikely that the Galaxy Watch Ultra 2 will cost as much as its nearest Apple Watch counterpart.</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-design-rumors"><span>Samsung Galaxy Watch Ultra 2: Design rumors</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:1100px;"><p class="vanilla-image-block" style="padding-top:156.27%;"><img id="HL7PvibxE82QGRF7UWtUfH" name="Samsung Galaxy Watch Ultra 2" alt="Leaked render of the Samsung Galaxy Watch Ultra 2" src="https://cdn.mos.cms.futurecdn.net/HL7PvibxE82QGRF7UWtUfH.jpg" mos="" align="middle" fullscreen="" width="1100" height="1719" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass)</span></figcaption></figure><p>Regular tech gadget leaker <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-and-ultra-2-fully-revealed-in-leaked-renders" target="_blank">Evan Blass</a> just shared a set of Galaxy Watch 9 and Galaxy Watch Ultra 2 renderings that appear to be the real deal. That said, as with anything leaked, it's best to take these developments with a grain of salt.</p><p>Nevertheless, changes to the design of Galaxy Watch Ultra 2 appear to be minimal. The case shape and button placement all match the current model. However, a new blue colorway could be added to the fold. </p><p>Upgrades to the display, from an increased refresh rate to improved brightness, are possible, but given the Galaxy Watch Ultra already sports one of the brightest displays of any smartwatch out there, maxing out at 3,000 nits, it's far from guaranteed.</p><p>I'd personally like to see the case design slimmed down slightly. Of all the smartwatches I've tested (dozens upon dozens), it's among the chunkiest and heaviest. </p><p>Another possible design upgrade: improved water resistance. While the current Galaxy Watch Ultra boasts 100 meters of water resistance, Samsung advises against scuba diving with it. It'd be nice to see this warning disappear with the debut of the Galaxy Watch Ultra 2.</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-other-possible-upgrades"><span>Samsung Galaxy Watch Ultra 2: Other possible upgrades</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="worryfptobVeWDkpn8uzrM" name="GalaxyWatchUltraBracaglia01b-2.jpg" alt="Samsung Galaxy Watch Ultra on an orange strap sitting on a wood table next to small accessories like keys, a pen and a pocket knife" src="https://cdn.mos.cms.futurecdn.net/worryfptobVeWDkpn8uzrM.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>It seems likely that the Galaxy Watch Ultra will make use of the latest <a href="https://www.tomsguide.com/wellness/smartwatches/i-just-saw-the-future-of-smartwatches-heres-how-ai-will-supercharge-your-next-galaxy-and-pixel-watch">Snapdragon Wear Elite</a> processor, which should make it both faster and more power-efficient than its predecessor (more on that below). </p><p>I also expect improvements to the onboard Gemini AI voice assistant and likely an expansion of the health tracking tools and AI-backed wellness insights. However, this is just speculation. As of writing, concrete details on new Galaxy Watch Ultra 2 features are few and far between.</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-battery-rumors"><span>Samsung Galaxy Watch Ultra 2: Battery rumors</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:3698px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T9NUAcVH7WQNoiLcde2jFF" name="GalaxyWatchUltra-02" alt="Back of the Samsung Galaxy Watch Ultra showing the health sensor array" src="https://cdn.mos.cms.futurecdn.net/T9NUAcVH7WQNoiLcde2jFF.jpg" mos="" align="middle" fullscreen="" width="3698" height="2080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Okay, here's where you can get excited. With battery life being the number one thing holding back full-featured smartwatches in 2026 (IMHO), any advancements in longevity will be greatly appreciated. </p><p>According to a report from <a href="https://www.sammobile.com/news/galaxy-watch-ultra-2-massive-battery-upgrade" target="_blank">SamMobile</a>, the Galaxy Watch Ultra 2 could sport a massive 800 mAh battery, a serious upgrade over the Galaxy Watch Ultra's 590-mAh battery. In our testing, the Galaxy Watch Ultra lasts a respectable <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">two days per charge</a>. </p><p>If the Galaxy Watch Ultra 2 battery rumors turn out to be true, it could potentially offer as much as three days per charge, especially when you factor in a more efficient processor. Now that's a big deal!</p><h3 class="article-body__section" id="section-samsung-galaxy-watch-ultra-2-outlook"><span>Samsung Galaxy Watch Ultra 2: 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:2551px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="Xuu3RjPP846oJwdfZfJuo8" name="Galaxy-Watch-Ultra.jpg" alt="The Samsung Galaxy Watch Ultra on an orange rubber strap worn on the wrist of a user" src="https://cdn.mos.cms.futurecdn.net/Xuu3RjPP846oJwdfZfJuo8.jpg" mos="" align="middle" fullscreen="" width="2551" height="1436" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Ultimately, it sounds like the Galaxy Watch Ultra 2 will look the same as its predecessor. However, under-the-hood improvements to processing efficiency and speed, along with battery capacity, could make it a meaningful overall upgrade over the original Galaxy Watch Ultra. </p><p>We should know more in 30 days or less. Stay tuned. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/your-samsung-galaxy-watch-now-supports-blood-pressure-tracking-but-its-not-the-same-as-apples-hypertension-alerts">Your Samsung Galaxy Watch now supports blood pressure tracking — but it’s not the same as Apple’s Hypertension Alerts</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/take-off-that-apple-watch-5-reasons-why-its-okay-to-swap-your-smartwatch-for-a-dumb-watch">5 reasons why I sometimes still wear a 'dumb' watch</a></li><li><a href="https://www.tomsguide.com/computing/vr-ar/snapdragon-reality-elite-is-here-and-ive-already-tested-it-without-realizing-in-xreals-project-aura-its-a-giant-step-towards-the-future-of-smart-glasses">Snapdragon Reality Elite is here, and I’ve already tested it without realizing in Xreal’s Project Aura — its a giant step towards the future of smart glasses</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Fitbit Air performance issues? 3 ways to make sure the Fitbit Air accurately tracks your next workout ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-performance-issues-3-ways-to-make-sure-the-fitbit-air-accurately-tracks-your-next-workout</link>
                                                                            <description>
                            <![CDATA[ Some users are reporting fitness-tracking performance issues with the new Fitbit Air. However, these hiccups may actually be technical limitations rather than bugs. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kAYs5ctQBMpYbzhrcqpG29</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/EvMxy8b2KjzH2ks5YVcSAA-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 27 Jun 2026 11:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Fitness Trackers]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                    <category><![CDATA[Smartwatches]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/EvMxy8b2KjzH2ks5YVcSAA-1280-80.jpg">
                                                            <media:credit><![CDATA[Dan Bracaglia/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Hands-on with the Fitbit Air on the orange and brown Stephen Curry strap]]></media:description>                                                            <media:text><![CDATA[Hands-on with the Fitbit Air on the orange and brown Stephen Curry strap]]></media:text>
                                <media:title type="plain"><![CDATA[Hands-on with the Fitbit Air on the orange and brown Stephen Curry strap]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/EvMxy8b2KjzH2ks5YVcSAA-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’re having issues with your Fitbit Air’s fitness tracking accuracy, I’m here to help. I just reviewed the <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a> and have been wearing one pretty much nonstop for nearly a month. I’ve tested it against numerous other wearables, as well as Strava, while walking, running, hiking, and cycling with mostly impressive results. </p><p>Of course, shiny new pieces of consumer tech often ship with “quirks” —  who could forget Apple's “Antennagate” — but with a growing number of Fitbit Air users reporting issues with fitness tracking accuracy via TikTok and Reddit, it’s worth rehashing the device’s technical limitations, along with some troubleshooting tips. </p><p>So, if you’re having issues with Fitbit Air fitness tracking accuracy, try these three things.</p><h3 class="article-body__section" id="section-1-manually-start-your-workouts-from-the-app-don-t-use-auto-tracking"><span>1. Manually start your workouts from the app; don’t use auto-tracking </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="ktst4G4aEo3tp2SAEDwt7A" name="FitbitAir-01" alt="Hands-on with the Fitbit Air on the orange and brown Stephen Curry strap" src="https://cdn.mos.cms.futurecdn.net/ktst4G4aEo3tp2SAEDwt7A.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: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>The Fitbit Air’s auto workout tracking needs, well, work. At present, it only logs walks, bike rides, "sports," and "other activities." Moreover, you need to spend 15-20 consecutive minutes or more doing a supported activity for tracking to kick in. That’s hardly ideal.</p><p>For instance, <a href="https://www.tomsguide.com/wellness/running/im-a-running-noob-doing-my-first-5k-heres-all-the-tech-im-using-to-cross-the-finish-line">I'm a beginner runner</a> who averages about two miles per outdoor session. As a result, my runs tend to be shorter than 20 minutes, which means the Fitbit Air is hit-or-miss at automatically logging them.</p><p>Fortunately, the solution to this issue is simple: If you want to ensure the Fitbit Air <em>actually</em> records your workout, manually start a workout session for your activity of choice in the Google Health app (formerly the Fitbit app) before beginning. </p><h3 class="article-body__section" id="section-2-for-accurate-daily-step-counts-carry-your-phone-at-all-times"><span>2. For accurate daily step counts, carry your phone at all times</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:4382px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YVcdQrtyDuQoDUeaZKAmLi" name="SE3-v-Air-03" alt="Close-up of the Apple Watch SE 3 and Fitbit Air in a user's hand against a bright, colorful background" src="https://cdn.mos.cms.futurecdn.net/YVcdQrtyDuQoDUeaZKAmLi.jpg" mos="" align="middle" fullscreen="" width="4382" height="2465" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>One of the biggest complaints I've heard about the Fitbit Air is that daily step count totals are far from accurate. However, there's a good reason this might be the case.</p><p>As a reminder, the Fitbit Air lacks an onboard GPS. This means you need to carry a paired smartphone with you at all times if you want precise daily step count totals, as the Air piggybacks off your phone’s GPS signal. </p><h3 class="article-body__section" id="section-3-when-tracking-outdoor-workouts-always-bring-your-phone"><span>3. When tracking outdoor workouts, always bring your phone </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:4114px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="m3zAnMrGySMYrDxq46JKLY" name="Fitbit-Air-lead-03" alt="Close-up of the sensors on the Fitbit Air screenless fitness tracker" src="https://cdn.mos.cms.futurecdn.net/m3zAnMrGySMYrDxq46JKLY.jpg" mos="" align="middle" fullscreen="" width="4114" height="2315" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Dan Bracaglia/Tom's Guide)</span></figcaption></figure><p>Similarly, if you want accurate run, hike, walk, or bike data in your post-workout report, you must carry your phone along; otherwise, metrics like distance and pace will be far from accurate. </p><p>In my testing, you can start an outdoor-based workout from your phone, then leave it behind, and the Fitbit Air will try its best to measure location-based stats, but the results are <em>faaaar</em> from reliable. It’s also worth noting that there’s no onboard altimeter in the Fitbit Air. So, like GPS, the wearable relies on a paired phone, carried with you, for that info.</p><p>Ultimately, Google might be wise to add a warning in the Google Health app when users start an outdoor workout stating that a paired phone is required for accurate data. </p><p>Alternatively, Google could simply turn off all location-based metrics in the post-workout report when no GPS or altimeter info is available. If nothing else, this might help folks better understand the technical limitations of the Fitbit Air. </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/wellness/fitness-trackers/i-walked-3-500-steps-with-the-fitbit-air-vs-fitbit-inspire-3-and-theres-a-clear-winner">I walked 3,500 steps with the Fitbit Air vs Fitbit Inspire 3 — and there's a clear winner</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-went-for-a-run-with-the-fitbit-air-and-garmin-forerunner-70-to-see-how-the-usd99-tracker-compared-and-im-impressed">I went for a run with the Fitbit Air and Garmin Forerunner 70 to see how the $99 tracker compared, and I’m impressed</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-vs-fitbit-inspire-3-which-usd99-fitness-tracker-wins">Fitbit Air vs Fitbit Inspire 3 — which $99 fitness tracker wins?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Samsung Galaxy Watch 8 just crashed to $218 — but it won’t stay this cheap long ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/the-samsung-galaxy-watch-8-just-crashed-to-usd218-but-it-wont-stay-this-cheap-long</link>
                                                                            <description>
                            <![CDATA[ This late Prime Day deal is not to be missed: Save 38% on the Samsung Galaxy Watch 8 right now, before the buzzer sounds. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YRopbvxV8rZXRE4GpSgaT8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9cnbw53FxHnMzoaGwyhERJ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 27 Jun 2026 01:18:04 +0000</pubDate>                                                                                                                                <updated>Sat, 27 Jun 2026 01:21:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                <author><![CDATA[ dan.bracaglia@futurenet.com (Dan Bracaglia) ]]></author>                    <dc:creator><![CDATA[ Dan Bracaglia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/3Ev8EFrheNxPemMWSBaKcK.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;&lt;br&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/9cnbw53FxHnMzoaGwyhERJ-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039; Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Watch 8 deal]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Watch 8 deal]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Watch 8 deal]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9cnbw53FxHnMzoaGwyhERJ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-8-review">Samsung Galaxy Watch 8</a> is one of the best full-featured <a href="https://www.tomsguide.com/best-picks/best-smartwatches-android">Android smartwatches</a> you can buy right now, offering impressive health and fitness insights, a truly useful Gemini-backed AI voice assistant, an ultra-bright and responsive touchscreen, and solid battery life for its class. </p><p>It’s also on sale for a massive <a href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Coaching-Tracking/dp/B0F7PN7C8Z?th=1" target="_blank" rel="nofollow">38% off via Amazon.</a> However, with Prime Day winding down, this deal won’t last long! </p><h3 class="article-body__section" id="section-all-samsung-galaxy-watch-deals"><span>All Samsung Galaxy Watch deals</span></h3><ul><li><strong>Samsung Galaxy Watch 8: </strong><a href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Coaching-Tracking/dp/B0F7PN7C8Z?th=1" target="_blank" rel="nofollow"><strong>was $349 now $219 @ Amazon</strong></a></li><li><strong>Samsung Galaxy Watch 8 Classic: </strong><a href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Rotating-Coaching/dp/B0F7PS35R2?th=1" target="_blank" rel="nofollow"><strong>$499 now $344 @ Amazon</strong></a></li><li><strong>Samsung Galaxy Watch Ultra: </strong><a href="https://www.amazon.com/Samsung-Smartwatch-Titanium-Advanced-Coaching/dp/B0F7Q4L81N/?th=1" target="_blank" rel="nofollow"><strong>was $649 now $434 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-samsung-galaxy-watch-8-8-classic-or-ultra"><span>Samsung Galaxy Watch 8, 8 Classic, or Ultra?</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:3680px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XrqjxJLvxPqBkWLzisj2gC" name="Galaxy watch 8 hands on-7" alt="Close-up of the Samsung Galaxy Watch 8 and Galaxy 8 Classic on the writer's wrist" src="https://cdn.mos.cms.futurecdn.net/XrqjxJLvxPqBkWLzisj2gC.jpg" mos="" align="middle" fullscreen="" width="3680" height="2070" attribution="" endorsement="" class="inline"></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 has three current Galaxy Watch models on offer: the Galaxy Watch 8, Galaxy Watch 8 Classic, and <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-ultra-review">Galaxy Watch Ultra</a>. While they all boast essentially the same set of features, the Classic and Ultra are quite a bit pricier than the standard Galaxy Watch 8. Both are also quite a bit chunkier.</p><div class="product"><a data-dimension112="7e5e3c2c-86fe-4fdf-ab9e-2b09bdb9897a" data-action="Deal Block" data-label="best smartwatches for Android" data-dimension48="best smartwatches for Android" data-dimension25="$218" href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Coaching-Tracking/dp/B0F7PN7C8Z?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:900px;"><p class="vanilla-image-block" style="padding-top:115.56%;"><img id="cjKftU2kDHgxXTciBzUgn7" name="GalaxyWatch8-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/cjKftU2kDHgxXTciBzUgn7.jpg" mos="" align="middle" fullscreen="" width="900" height="1040" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Samsung Galaxy Watch 8 is one of the <a href="https://www.tomsguide.com/best-picks/best-smartwatches-android" data-dimension112="7e5e3c2c-86fe-4fdf-ab9e-2b09bdb9897a" data-action="Deal Block" data-label="best smartwatches for Android" data-dimension48="best smartwatches for Android" data-dimension25="$218">best smartwatches for Android</a> you can buy. It’s also seriously discounted by <a href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Coaching-Tracking/dp/B0F7PN7C8Z" target="_blank" rel="nofollow">38% for Prime Day</a>. That drops the price from $349  to just $218 for one of the most feature-packed smartwatches in the known universe, with best-in-class sleep insights, a Gemini-backed AI voice assistant, impressive fitness and training insights, an ultra-bright screen, and a slender case design. <a class="view-deal button" href="https://www.amazon.com/Samsung-Bluetooth-Smartwatch-Coaching-Tracking/dp/B0F7PN7C8Z?th=1" target="_blank" rel="nofollow" data-dimension112="7e5e3c2c-86fe-4fdf-ab9e-2b09bdb9897a" data-action="Deal Block" data-label="best smartwatches for Android" data-dimension48="best smartwatches for Android" data-dimension25="$218">View Deal</a></p></div><p>And even though the 8 Classic and Ultra outperform the standard Galaxy Watch 8 in terms of battery performance, the latter still lasts a respectable 30 hours per charge on average. That’s roughly 6 more hours of power per charge than the <a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-series-11-review">Apple Watch Series 11</a>. </p><h3 class="article-body__section" id="section-best-in-class-sleep-tracking-gemini-ai-in-a-slender-design"><span>Best-in-class sleep tracking + Gemini AI in a slender design</span></h3><p>Whether you’re rocking one of the newest Samsung Galaxy Watches or the Galaxy Ring, Samsung’s sleep reports are loaded with insights and actionable advice. The Galaxy Watch 8 additionally supports FDA-approved sleep apnea detection and temperature-based women’s health tracking.</p><p>The Watch 8 ships with Google’s truly excellent Gemini AI voice assistant built in, which is capable of answering fairly complex, context-based questions. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3284px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="rXN9MtzoFS9MMPmPETPYLC" name="Galaxy watch 8 hands on-4" alt="Close-up of the Samsung Galaxy Watch 8 on the writer's wrist showing the Gemini AI assistant feature" src="https://cdn.mos.cms.futurecdn.net/rXN9MtzoFS9MMPmPETPYLC.jpg" mos="" align="middle" fullscreen="" width="3284" height="1847" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Ultimately, even though new Samsung Galaxy Watches are expected this summer — the core lineup refreshes annually —  as of now, we don’t expect any groundbreaking improvements in the form of the<a href="https://www.tomsguide.com/wellness/smartwatches/samsung-galaxy-watch-9-and-ultra-2-rumors-everything-weve-heard-so-far"> Galaxy Watch 9</a>. </p><p>You can also snag the Galaxy Watch 8 with confidence that Samsung will support it with the latest features via free firmware updates for years to come. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I think every Garmin watch owner should have these two accessories, and you can get them both for under $20 in the Prime Day sale ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/wellness/smartwatches/i-think-every-garmin-watch-owner-should-have-these-two-accessories-and-you-can-get-them-both-for-under-usd20-in-the-prime-day-sale</link>
                                                                            <description>
                            <![CDATA[ Make your Garmin watch more comfortable and easy to charge with these affordable accessories that are reduced in the Prime Day sale. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">m83mqprgS8JzwfBqyhagDC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/3eV3emrbm3yEQkjibiVCMQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 25 Jun 2026 14:54:49 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Smartwatches]]></category>
                                                    <category><![CDATA[Wellness]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nick Harris-Fry ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/J5Jjp49GUVjLZEbjEkTex.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nick has been a journalist since 2012 and has spent most of that time writing about health and fitness for a variety of publications. Nick spent nine years working on the Coach magazine and website before moving to the fitness team at Tom’s Guide in 2024. Nick is a keen runner and also the founder of YouTube channel &lt;a href=&quot;https://www.youtube.com/channel/UCOBM9FasII4dKbyE_HKkbjw&quot;&gt;The Run Testers&lt;/a&gt;, which specialises in reviewing running shoes, watches, headphones and other gear.&lt;/p&gt;&lt;p&gt;Nick has covered all aspects of health and fitness throughout his career, interviewing experts and celebrities, trying fitness classes and running marathons, all in the name of providing readers with the information they need to get the most out of an active lifestyle.&lt;/p&gt;&lt;p&gt;Nick ran his first marathon in 2016 after six weeks of training for a magazine feature and subsequently became obsessed with the sport. He now has PBs of 2hr 25min for the marathon and 15min 30sec for 5K, and has run 16 marathons in total, as well as a 50-mile ultramarathon.&lt;/p&gt;&lt;p&gt;Nick runs 60-90 miles a week and races regularly with his club, which gives him a lot of opportunity to test out running gear: he has tested and reviewed hundreds of pairs of running shoes, as well as fitness trackers, running watches, sports headphones, treadmills, and all manner of other kit. Nick is also a qualified Run Leader in the UK.&lt;/p&gt;&lt;p&gt;Nick is an established expert in the health and fitness area and along with writing for several publications, including &lt;a href=&quot;https://www.livescience.com/author/nick-harris-fry&quot;&gt;Live Science&lt;/a&gt;, &lt;a href=&quot;https://www.expertreviews.co.uk/authors/nick-harris-fry&quot;&gt;Expert Reviews&lt;/a&gt;, &lt;a href=&quot;https://www.wareable.com/author/n.harris-fry&quot;&gt;Wareable&lt;/a&gt;, &lt;a href=&quot;https://www.coachweb.com/author/nick-harris-fry&quot;&gt;Coach&lt;/a&gt; and &lt;a href=&quot;https://www.getsweatgo.com/author/n.harrisfry&quot;&gt;Get Sweat Go&lt;/a&gt;, he has been quoted on &lt;a href=&quot;https://www.theguardian.com/thefilter/2024/oct/20/if-you-pay-more-than-4-youre-being-ripped-off-the-fair-price-for-14-everyday-items-from-cleaning-spray-to-olive-oil&quot;&gt;The Guardian&lt;/a&gt; and &lt;a href=&quot;https://www.independent.co.uk/life-style/health-and-families/london-marathon-2021-date-training-tips-summer-running-a9482486.html&quot;&gt;The Independent&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Nick graduated from the University of York in 2010 with a degree in Politics, Philosophy and Economics and worked in the NHS for three years, during which time he completed his NCTJ Diploma in Journalism at News Associates in London. Before starting on Coach and moving into health and fitness, Nick worked as a football journalist and lived in Kathmandu, Nepal for two years.&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/3eV3emrbm3yEQkjibiVCMQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Garmin Accessories Prime Day deals]]></media:description>                                                            <media:text><![CDATA[Garmin Accessories Prime Day deals]]></media:text>
                                <media:title type="plain"><![CDATA[Garmin Accessories Prime Day deals]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/3eV3emrbm3yEQkjibiVCMQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been using Garmin watches for a decade and for the most part, I love them. As am avid runner, they cover off everything I need thanks to their accurate tracking, lightweight designs and handy training analysis.</p><p>However, there are two minor annoyances that crop up with almost all Garmin watches. One is that they require a proprietary charging cable, and the other is that almost all of them ship with a silicone band as standard.</p><p>Neither is a major problem and there are reasons for both — the proprietary charging port is key to waterproofing the watches, and silicone bands are very durable and reliable picks for most people. However, I prefer to carry just one cable with me, and I prefer nylon bands in general.</p><p>Fortunately it’s very easy and cheap to solve both these minor problems with a couple of accessories, and both of the ones I use are reduced in the Prime Day sale right now, so you can pick them up for under $20 in total.</p><h2 id="make-your-watch-more-comfortable-with-a-nylon-band">Make your watch more comfortable with a nylon band</h2><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="raDxffPGLHLsptDuHdPHuD" name="Garmin Fenix 8" alt="Garmin Fenix 8 with nylon band" src="https://cdn.mos.cms.futurecdn.net/raDxffPGLHLsptDuHdPHuD.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Abanen nylon band is easy to fit to any Garmin watch — just loop it around your watch pins — and it’s comfortable to wear 24/7 in my experience.</p><div class="product"><a data-dimension112="35525f8e-b33a-454e-bb02-529ccdffeff5" data-action="Deal Block" data-label="This lightweight nylon band comes in several colors, all of which have been reduced for Prime Day. It's an affordable alternative to Garmin's own nylon bands, which cost around $40, and just as comfortable in my experience." data-dimension48="This lightweight nylon band comes in several colors, all of which have been reduced for Prime Day. It's an affordable alternative to Garmin's own nylon bands, which cost around $40, and just as comfortable in my experience." data-dimension25="$12" href="https://www.amazon.com/Abanen-Ultralight-Wristband-Sapphire-Instinct/dp/B092Q6KJ5D" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:510px;"><p class="vanilla-image-block" style="padding-top:104.90%;"><img id="S2vX8Km7aC3NWseq6Yo88m" name="Abanen Hook and Loop Quick Dry Watch Band" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/S2vX8Km7aC3NWseq6Yo88m.png" mos="" align="middle" fullscreen="" width="510" height="535" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This lightweight nylon band comes in several colors, all of which have been reduced for Prime Day. It's an affordable alternative to Garmin's own nylon bands, which cost around $40, and just as comfortable in my experience.<a class="view-deal button" href="https://www.amazon.com/Abanen-Ultralight-Wristband-Sapphire-Instinct/dp/B092Q6KJ5D" target="_blank" rel="nofollow" data-dimension112="35525f8e-b33a-454e-bb02-529ccdffeff5" data-action="Deal Block" data-label="This lightweight nylon band comes in several colors, all of which have been reduced for Prime Day. It's an affordable alternative to Garmin's own nylon bands, which cost around $40, and just as comfortable in my experience." data-dimension48="This lightweight nylon band comes in several colors, all of which have been reduced for Prime Day. It's an affordable alternative to Garmin's own nylon bands, which cost around $40, and just as comfortable in my experience." data-dimension25="$12">View Deal</a></p></div><p>I also find it dries quickly after sweaty workouts or swims, and if you pop it into the washing machine occasionally it will remove any odors that start to build up.</p><p>There are lots of nylon band options available on Amazon and elsewhere; I prefer the fit and feel of them to silicone bands in general, because they’re easier to adjust and lighter. Garmin’s own nylon bands are great, but so much more expensive than this one.</p><p>Nylon bands are less durable than silicone ones, so you might have to replace them every couple of years depending on how fresh you want your band to look, but I almost always swap a nylon band in to replace the silicone one when testing a new Garmin watch.</p><h2 id="charge-your-garmin-more-easily-with-a-usb-c-adapter">Charge your Garmin more easily with a USB-C adapter</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WxPF5giSUQRHyacmS6VB4d" name="Garmin USB-C adaptor" alt="Garmin USB-C adaptor" src="https://cdn.mos.cms.futurecdn.net/WxPF5giSUQRHyacmS6VB4d.jpg" mos="" align="middle" fullscreen="" width="5712" height="3213" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This cheap and simple accessory is the kind of thing you kick yourself for not buying earlier when you finally discover it.</p><p>It’s an adapter that allows you to charge any Garmin watch using a standard USB-C cable, and it comes with a keychain attachment to make sure you never leave it behind.</p><div class="product"><a data-dimension112="9a421bcc-e94a-4d44-9fd1-cd3658d18aac" data-action="Deal Block" data-label="You get three Garmin to USB-C adapters for just six bucks with these deal, and each comes with a loop attachment that makes it easier to affix it to your keys or a bag." data-dimension48="You get three Garmin to USB-C adapters for just six bucks with these deal, and each comes with a loop attachment that makes it easier to affix it to your keys or a bag." data-dimension25="$6" href="https://www.amazon.com/Meliya-Charging-Forerunner-Instinct-Vivoactive/dp/B0D2Q5WQMH" 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:99.13%;"><img id="sP6BZNWvygS5dd73tSK4K7" name="USB-C Adaptor" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/sP6BZNWvygS5dd73tSK4K7.png" mos="" align="middle" fullscreen="" width="1500" height="1487" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>You get three Garmin to USB-C adapters for just six bucks with these deal, and each comes with a loop attachment that makes it easier to affix it to your keys or a bag.<a class="view-deal button" href="https://www.amazon.com/Meliya-Charging-Forerunner-Instinct-Vivoactive/dp/B0D2Q5WQMH" target="_blank" rel="nofollow" data-dimension112="9a421bcc-e94a-4d44-9fd1-cd3658d18aac" data-action="Deal Block" data-label="You get three Garmin to USB-C adapters for just six bucks with these deal, and each comes with a loop attachment that makes it easier to affix it to your keys or a bag." data-dimension48="You get three Garmin to USB-C adapters for just six bucks with these deal, and each comes with a loop attachment that makes it easier to affix it to your keys or a bag." data-dimension25="$6">View Deal</a></p></div><p>This adapter has been on my keys for a year now and pretty much anytime a Garmin user I know sees it, they jump onto Amazon and buy one for themselves. </p><p>It’s been especially useful for holidays and short trips where I just want to take one cable to charge my phone, headphones and watch, or indeed use a power back that has a USB-C out cable.</p><p>There are several of these adapters in the Prime Day sale, with the best deal netting you a pack of three for just $6, so you have two to give away to your Garmin-wearing friends when they clock yours.</p><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Fitness&view_mode=savings_squad&widget_title=Top+Fitness+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = mode === 'savings_squad' ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.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 && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.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 seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += 12;              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>