<?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/dji" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Dji ]]></title>
                <link>https://www.tomsguide.com/tag/dji</link>
        <description><![CDATA[ All the latest dji content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Tue, 28 Jul 2026 09:30:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ I’ve tested a ton of cameras and drones in 2026 — and these are my 5 favorites (so far) from DJI, Canon, Leica and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/my-favorite-cameras-drones-of-2026-so-far</link>
                                                                            <description>
                            <![CDATA[ So far in 2026, I've reviewed 12 cameras and drones, and most of them have been great. I've rounded up my 5 favorite launches from DJI, Leica, Canon and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fu6oRbiFGucyM7BebmFdqB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/dC5BFQtr2RkKfex6uJSyok-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Jul 2026 09:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/dC5BFQtr2RkKfex6uJSyok-1280-80.jpg">
                                                            <media:credit><![CDATA[Nikita Achanta / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Osmo Pocket 4P, Leica SL3-P, DJI Avata 360]]></media:description>                                                            <media:text><![CDATA[A DJI Osmo Pocket 4P, Leica SL3-P, DJI Avata 360]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Osmo Pocket 4P, Leica SL3-P, DJI Avata 360]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/dC5BFQtr2RkKfex6uJSyok-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Every time the half-year mark comes around, I think to myself, "This has been a great year for cameras." It happened last year and the year before, and it has happened again this year. So far in 2026, we've been treated to some fantastic cameras and drones, and brands continue to prove that there's still room to grow and develop in terms of imaging tech.</p><p>If you don't know me, my name is Nikita and I'm a Senior Reviews Writer, testing the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> and the <a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">best cameras</a>. This year, I've tested 12 of these nifty gadgets so far — from keychain cameras like the <a href="https://www.tomsguide.com/cameras-photography/kodak-charmera-review">Kodak Charmera</a> and black-and-white snappers like the <a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/leica-q3-monochrom-review">Leica Q3 Monochrom</a>, to speedy mirrorless beasts like the <a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/canon-eos-r6-mark-iii-review">Canon EOS R6 Mark III</a> and aerial wonders like the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review">DJI Avata 360</a>.</p><p>After a somewhat slow start to the year, we've been spoiled thanks to new launches from the likes of Leica, and DJI coming out with a range of drones and gimbal cameras. Now that we're well into July, I thought I'd round up my top five cameras and drones of 2026 so far. Has there been a camera or drone that's been a standout for you? I'd love to hear from you in the comments!</p><h2 id="5-kodak-charmera">5. Kodak Charmera</h2><p><strong>Just a no-frills, fun keychain camera</strong><br><em>My rating: </em>★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6saMUxA9kPbPgFgeWW28PG" name="Kodak-Charmera-op-ed-7" alt="A photo of a Kodak Charmera keychain camera" src="https://cdn.mos.cms.futurecdn.net/6saMUxA9kPbPgFgeWW28PG.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" class="inline"><img id="WqLzPy4iPS8qbMqK42dYLY" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/WqLzPy4iPS8qbMqK42dYLY.png" name="TG_badges_Recommended.png" alt="Tom's Guide Recommended product badge"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>When I was putting this list together, I knew the Kodak Charmera was going to be included. If there's one thing 2026 has shown us already it's that cameras can be whimsical and just pure fun — and the Charmera proves it. You may have seen this nifty little keychain camera on TikTok or Instagram. It went viral earlier this year for its compact form factor and oh-so little asking price, and if you need a no-frills camera for a night out, this is the one to get.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/CVv9bGrVysbZQaXnVbH7e.jpg" alt="A photo taken on a Kodak Charmera keychain camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/7Cx73wSeWvkBVmo3gkkHe.jpg" alt="A photo taken on a Kodak Charmera keychain camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eKe3jankij69jYdFfHeFf.jpg" alt="A photo taken on a Kodak Charmera keychain camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/kVABmfTeRPEeNn4oGBxji.jpg" alt="A photo taken on a Kodak Charmera keychain camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/WV7mFBFQGiyC7tAe9HwdmF.jpg" alt="A photo taken on a Kodak Charmera keychain camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QJaxTurnLxgSWUhLQL5mfF.jpg" alt="A photo taken on a Kodak Charmera keychain camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/epp7DtZGJBrRdk66U4aJaF.jpg" alt="A photo taken on a Kodak Charmera keychain camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ZPjnnhLUJw337C4KfG6yaF.jpg" alt="A photo taken on a Kodak Charmera keychain camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>Though the camera is fitted with a 1.6MP 1/4-inch CMOS sensor that doesn't take award-winning images, the Charmera is all about fun. The charm lies in its lo-fi images that remind me of the photos in my family's photo albums. What makes the Charmera unique is its extremely portable body — clip it on to your keys or your bag and you're good to go.</p><p>What I love most about the Charmera is its ease of use. Your 5-year-old niece who's just getting to grips with using her hands will be able to use it, as will your 60-year-old uncle who just wants to immortalize memories without caring much about image quality. Pass it around a table at a pub, or add it to the camera gear that's going to be at your wedding — the Charmera is for everyone.</p><p><em><strong>Read my full </strong></em><a href="https://www.tomsguide.com/cameras-photography/kodak-charmera-review"><em><strong>Kodak Charmera review</strong></em></a><em><strong>.</strong></em></p><h2 id="4-dji-osmo-pocket-4p">4. DJI Osmo Pocket 4P</h2><p><strong>DJI's best gimbal camera just got better</strong><br><em>My rating: Not scored yet</em></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:8160px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qCUokiPvBDuDKcMxQ6DiKP" name="DJI Osmo Pocket 4P" alt="DJI Osmo Pocket 4P gimbal camera" src="https://cdn.mos.cms.futurecdn.net/qCUokiPvBDuDKcMxQ6DiKP.jpg" mos="" align="middle" fullscreen="" width="8160" height="4590" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>The DJI Osmo Pocket 4P is perhaps one of the industry's worst kept secrets. Rumors have been circulating for months, so when the <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review">DJI Osmo Pocket 4</a> dropped, people wondered why it didn't have two dual lenses — and then the Osmo Pocket 4P dropped. Well, you can't buy it yet, but it's out there. I've held it; I've recorded footage on it in Malta; and I can tell you that it's very real. I can also tell you that this gimbal camera might give the Insta360 Luna Ultra a run for its money.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="high" data-lazy-src="https://www.youtube-nocookie.com/embed/0RR3ZHn9PIs" allowfullscreen></iframe></div></div><p>But my lips are sealed due to embargoes and restrictions, and all I can really tell you about the Osmo Pocket 4P is this: it features D-Log2 support and a whopping 17 stops of dynamic range, and it comes in black and white. It's also got two lenses, one of which is a 60mm medium-telephoto.</p><p>I've spent a fair amount of time using the Osmo Pocket 4P, and it didn't take long for it to become one of my favorite cameras of 2026 so far. And why wouldn't it be? It builds on the success of the base Osmo Pocket 4 (which received a 5/5 rating from Senior Reviews Editor, Peter Wolinski). If you haven't bought the base model, I think it's worth waiting for the Osmo Pocket 4P. Trust me, I've been gobsmacked by it, and I'm sure you will be too.</p><p><em><strong>Read my </strong></em><a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4p-first-impressions"><em><strong>first impressions of the DJI Osmo Pocket 4P</strong></em></a><em><strong>.</strong></em></p><h2 id="3-canon-eos-r6-mark-iii">3. Canon EOS R6 Mark III</h2><p><strong>Good becomes great</strong><br><em>My rating: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1144px;"><p class="vanilla-image-block" style="padding-top:56.29%;"><img id="D7e7kySfUuavP3WUz4GNB7" name="EOSR6III" alt="A woman holding a Canon EOS R6 Mark III mirrorless camera" src="https://cdn.mos.cms.futurecdn.net/D7e7kySfUuavP3WUz4GNB7.jpg" mos="" align="middle" fullscreen="" width="1144" height="644" attribution="" class="inline"><img id="Xc987sPL6EDZGCrLfXakAb" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/Xc987sPL6EDZGCrLfXakAb.png" name="TG_ed_choice.png" alt="Editor's Choice"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>The Canon EOS R6 Mark III succeeded the second-gen model in November 2025, but I tested the camera in 2026, so it counts! Good became great as Canon introduced substantial upgrades to its predecessor to deliver one of the best mid-range cameras. Having taken over 6,000 photos on the EOS R6 Mark III, I've been extremely impressed with its capabilities. The camera packs a 32.5MP full frame sensor that captures plenty of detail and gives you some room for making crops in post-production, too.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/o5ihpTX4au5gnxiDY9AwPL.jpg" alt="A photo of a bird taken on a Canon EOS R6 Mark III" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/VHYRdKJR2YWjUrkNHvqsoH.jpg" alt="A photo of a bird taken on a Canon EOS R6 Mark III" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/JRBdm9sveRvc59k48WyckN.jpg" alt="A photo taken on a Canon EOS R6 Mark III" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/m3k6CEYHNxn6Xd6cCF7a6N.jpg" alt="A photo taken on a Canon EOS R6 Mark III" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gBMPCTLGBPc4ZAUbjUWQPG.jpg" alt="A photo of a bird taken on a Canon EOS R6 Mark III" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/vDpMPYRapknZfeexVKnE4e.jpg" alt="A portrait of a woman taken on a Canon EOS R6 Mark III" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/dtNSdK2Fddey93oxbABDse.jpg" alt="A portrait of a woman taken on a Canon EOS R6 Mark III" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Gyjer5UkV9bN6zDAxCcHDL.jpg" alt="A photo of a bird taken on a Canon EOS R6 Mark III" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>Combine that beautiful sensor with 40fps burst shooting and best-in-class autofocus, and you've got yourself a powerful camera for sports, wildlife, portraits, landscapes, you name it. As someone who loves photographing birds and animals, I appreciated the EOS R6 Mark III's ability to quickly lock on to subjects and capture stunning images. Canon's vaunted color science is the cherry on top of the cake.</p><p>And it's a delicious cake topped with many, many cherries. 7K Open Gate video and 4K/120fps video capabilities make the EOS R6 Mark III a competent hybrid camera. The addition of CFExpress support means the camera can accommodate 7K RAW files and sustain its rapid 40fps drive.</p><p><em><strong>Read my full </strong></em><a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/canon-eos-r6-mark-iii-review"><em><strong>Canon EOS R6 Mark III review</strong></em></a><em><strong>.</strong></em></p><h2 id="2-leica-sl3-p">2. Leica SL3-P</h2><p><strong>Finally taking the fight to Canon and Sony</strong><br><em>My rating: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="MacjWovY6eSwvbHoVEVRSS" name="Leica_SL3P_-24" alt="A Leica SL3-P full frame mirrorless camera" src="https://cdn.mos.cms.futurecdn.net/MacjWovY6eSwvbHoVEVRSS.jpg" mos="" align="middle" fullscreen="" width="2048" height="1151" attribution="" class="inline"><img id="Xc987sPL6EDZGCrLfXakAb" class="endorsement-img endorsement-top-left" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/Xc987sPL6EDZGCrLfXakAb.png" name="TG_ed_choice.png" alt="Editor's Choice"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>Leica’s a legacy brand and though it has always made excellent (albeit <em>very </em>expensive) cameras, it’s always struggled to compete with heavy hitters like Sony and Canon, in my opinion — until now. The Leica SL3-P is one of the finest mirrorless cameras I’ve ever tested, and certainly the best of 2026 so far. What makes the SL3-P a standout is its sublime handling, superb build quality (you'd expect nothing less at this price), and imaging prowess.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/hdtKZgQotL6okoXG9G5pPW.jpg" alt="A photo taken on a Leica SL3-P full frame mirrorless camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/aFFRvACeHveBxUoRyRBgbV.jpg" alt="A photo taken on a Leica SL3-P full frame mirrorless camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/oP4baSJuL6XDisYWtnNbAW.jpg" alt="A photo taken on a Leica SL3-P full frame mirrorless camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/VkwACTGDWLmpQqERZbQWaW.jpg" alt="A photo taken on a Leica SL3-P full frame mirrorless camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/i48uLwhxzkVGkkeEG84tGU.jpg" alt="A photo taken on a Leica SL3-P full frame mirrorless camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/riEqBKAdhLEfyJpmKhvBkT.jpg" alt="A photo taken on a Leica SL3-P full frame mirrorless camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/fnSAYyt6PaaidREWEuMX6U.jpg" alt="A photo taken on a Leica SL3-P full frame mirrorless camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/wveAu6kEEKr8LKZ2MXG9bV.jpg" alt="A photo taken on a Leica SL3-P full frame mirrorless camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>I was seriously impressed with its 40fps high-speed drive and best-in-class autofocus that ensures you never miss an action shot — and as a wildlife photographer, I love it. Throw in a 44MP sensor, 8K Open Gate video, strong dynamic range performance, and sublime handling, and you’ve got yourself a winner. Well done, Leica.</p><p>The SL3-P makes Leica a serious alternative to Canon and Sony, and if you think, "Nope, Leicas are way too expensive," you'd be wrong. Sony's flagship <a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/sony-a1-ii-review">A1 II </a>and Canon's <a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/canon-eos-r5-mark-ii-review">EOS R5 Mark II</a> bodies cost almost the same. I don't think Leica's price tag should scare you any longer — especially when you're getting a ridiculously sharp sensor.</p><p><em><strong>Read my full </strong></em><a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/leica-sl3-p-review"><em><strong>Leica SL3-P review.</strong></em></a></p><h2 id="1-dji-avata-360">1. DJI Avata 360</h2><p><strong>DJI claims its stake as the king of the skies</strong><br><em>My rating: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="b4HLoC8e5MA5dACvMWYTcn" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/b4HLoC8e5MA5dACvMWYTcn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" class="inline"><img id="Xc987sPL6EDZGCrLfXakAb" class="endorsement-img endorsement-bottom-right" style="max-width: 100px; max-height: 100px;" src="https://cdn.mos.cms.futurecdn.net/Xc987sPL6EDZGCrLfXakAb.png" name="TG_ed_choice.png" alt="Editor's Choice"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When the <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a>, the world's first 360° drone came out last year, I thought to myself, "This is an excellent drone; I wonder what DJI's answer is going to be." And DJI's answer was simple: the Avata 360 did everything the Antigravity A1 does but better, and at a much lower price. It undercut its primary rival, and DJI delivered a 360° drone that doesn't give you much to complain about.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DtyupaS6iLc" allowfullscreen></iframe></div></div><p>I absolutely adore the Avata 360, and as someone who has spent nearly a thousand hours flying, testing, writing and reading about drones, it's one of the best today, period. Fitted with twin lenses that capture every angle in 8K at 60fps without any stitching lines, and 120MP hi-res stills, the Avata 360 is a formidable content creation tool.</p><p>Exceptional build quality, dual ways to fly (FPV and with a standard controller), user-friendly software for editing, you name it: the Avata 360 does it all. Out of all the cameras and drones I've tested this year so far, this is the one I come back to time and again. DJI, despite <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">facing a ban on its drones and enhanced scrutiny in the U.S.</a>, shows no signs of stopping with its Avata 360, Lito X1 and Lito 1 quadcopters, and I can't wait to see what else the Chinese giant has up its sleeve going forward.</p><p><em><strong>Read my full </strong></em><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review"><em><strong>DJI Avata 360 review</strong></em></a><em><strong>.</strong></em></p><h2 id="there-s-more-where-that-came-from">There's more where that came from...</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="48Awcj5xnebuk8DUcES6QK" name="Instax-mini-evo-cinema-hands-on" alt="A black Fujifilm Instax mini Evo Cinema hybrid instant camera" src="https://cdn.mos.cms.futurecdn.net/48Awcj5xnebuk8DUcES6QK.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>There are, of course, other cameras I've tested that haven't made the list, but they still deserve a shoutout. The first honorable mention that springs to my mind is the <a href="https://www.tomsguide.com/cameras-photography/fujifilm-instax-mini-evo-cinema-review">Fujifilm Instax mini Evo Cinema</a>, a hybrid instant camera that redefines everything we know about instant cameras.</p><p>It's one of a kind: it lets you shoot photos and print directly from your smartphone, and you can record video clips up to 15 seconds long, choose a frame, and print on Instax film with a QR code that plays said video on a smartphone. It's fun and it's different, and it earned a 4.5-star rating from 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:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PmesVhwYyHfbn39d98LUVX" name="Fujifilm_Instax_Mini_13-16" alt="A Candy Pink Fujifilm Instax mini 13 instant camera" src="https://cdn.mos.cms.futurecdn.net/PmesVhwYyHfbn39d98LUVX.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>Then there's the <a href="https://www.tomsguide.com/cameras-photography/fujifilm-instax-mini-13-review">Fujifilm Instax mini 13</a>, which takes things back to basics. It's an analog instant cameras that simply shoots and prints photos within 90 seconds. Image and print quality is great, with retro colors that remind us all why we fell in love with instant photography in the first place.</p><p>I also tested the <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-3-review">Potensic Atom 3</a>, a powerful DJI alternative that, for the first time on a Potensic drone, introduces 4K/60fps video and RAW images. At an affordable price tag, the Atom 3 packs up to 50 minutes of flight time and accurate AI subject tracking.</p><p>But that's all from me (for now). I hope you've enjoyed reading about my favorite cameras and drones of 2026 so far just as much as I've enjoyed writing about them. And like I said, do let me know in the comments what's been your favorite release this year!</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/tech/the-best-tech-of-2026-so-far-26-products-weve-actually-tested-rated-and-loved">The best tech of 2026 (so far): 26 products we've actually tested, rated and loved</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">I’ve spent over 900 hours testing all the best drones: here are my top picks</a></li><li><a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">The best cameras in 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The best tech of 2026 (so far): 26 products we've actually tested, rated and loved ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/tech/the-best-tech-of-2026-so-far-26-products-weve-actually-tested-rated-and-loved</link>
                                                                            <description>
                            <![CDATA[ Here are our favorite products from 2026 after 6 months of non-stop testing. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fxer8wYcfWtdzTtoWLRU8V</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/FmXxAvFaaLWwRyAoZLwEyf-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 11 Jul 2026 11:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Tech]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                        <dc:contributor><![CDATA[ Nikita Achanta ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Paul Antill ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Jason England ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Ruth Jones ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Nicola Appleton ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ John Velasco ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Kate Kozuch ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Erin Bashford ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Ashley Thieme ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Mike Prospero ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Rory Mellon ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Jane McGuire ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Camilla Sharman ]]></dc:contributor>
                                            <dc:contributor><![CDATA[ Cynthia Lawrence ]]></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/FmXxAvFaaLWwRyAoZLwEyf-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A split image showing an iPhone 17, Fitbit Air and Apple AirPods Max 2]]></media:description>                                                            <media:text><![CDATA[A split image showing an iPhone 17, Fitbit Air and Apple AirPods Max 2]]></media:text>
                                <media:title type="plain"><![CDATA[A split image showing an iPhone 17, Fitbit Air and Apple AirPods Max 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/FmXxAvFaaLWwRyAoZLwEyf-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're now into July, which means we've done six full months of testing here at Tom's Guide in 2026. From <a href="https://www.tomsguide.com/home/coffee-makers/best-coffee-makers">coffee machines</a>, through to vacuums, gaming handhelds, laptops and <a href="https://www.tomsguide.com/best-picks/best-phones">phones</a> — not only is it our job to put tech through its paces, it's what our journalists, editors and contributors love to do. </p><p>I'm Pete, Senior Reviews Editor here at Tom's Guide, and I head up our reviews coverage on site. My team of dedicated reviews writers alone have lab tested and reviewed hundreds of products already this year, with the wider Tom's Guide editorial team having testing dozens more. If you've not had your finger precisely on the pulse of the latest tech this year, well, I don't blame you — it's hard to keep tabs on everything. That's why we exist.</p><p>To help, I've gathered the Tom's Guide team's favorite products from 2026 so far. Obviously, I can't fit everything into a single article, so I asked our subject experts across the site to give me their top picks, too. I've also curated the top five highest scorers, which stand above the rest. Every product on here has been tested by us, hands-on, as part of a full, extensive review.</p><p>Read on to see the tech Tom's Guide loved in the first half of 2026.</p><h3 class="article-body__section" id="section-tom-s-guide-s-top-5"><span>Tom's Guide's Top 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QtcQdgVxistWUAqm4jKVz9" name="Samsung-S95H--2" alt="Samsung S95H OLED TV on a desk" src="https://cdn.mos.cms.futurecdn.net/QtcQdgVxistWUAqm4jKVz9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Every product on this list has scored at least four stars, earning our TG Recommended or Editor's Choice badges. But there are five products on this list that scored our full five stars after testing. These are the best of the best so far this year. To save you some time, here are the links to our reviews.</p><ul><li><strong></strong><a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review"><strong>DJI Osmo Pocket 4 review </strong></a>★★★★★</li><li><strong></strong><a href="https://www.tomsguide.com/gaming/007-first-light-review"><strong>007 First Light review </strong></a>★★★★★</li><li><strong></strong><a href="https://www.tomsguide.com/home/kitchenaid-artisan-plus-mixer-review"><strong>KitchenAid Artisan Plus review </strong></a>★★★★★</li><li><strong></strong><a href="https://www.tomsguide.com/home/kitchen-dining/gozney-dome-xl-2-review"><strong>Gozney Dome XL Gen 2 review </strong></a>★★★★★</li><li><strong></strong><a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s95h-oled-tv-review"><strong>Samsung S95H OLED review </strong></a>★★★★★</li></ul><p>Keep reading to see the rest of our top tested picks for 2026.</p><h2 class="article-body__section" id="section-ai"><span>AI</span></h2><h2 id="rokid-glasses"><a href="https://www.tomsguide.com/computing/smart-glasses/rokid-glasses-review">Rokid Glasses</a></h2><p><strong>After 5,000 miles in the Rokids, we were seriously impressed</strong><br><em>Score: </em>★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Wnk4WGatZwDH9NWg5qLJd4" name="Rokid Glasses" alt="Rokid Glasses" src="https://cdn.mos.cms.futurecdn.net/Wnk4WGatZwDH9NWg5qLJd4.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 <a href="https://www.tomsguide.com/computing/vr-ar/best-smart-glasses">best smart glasses</a> without a display are cool and all, but their features are usually rather limited to just asking questions about what you see. The Rokid Glasses proved to me that adding a screen turns that superpower into an ambient computing platform — offering features only when you need them and disappearing into the background in some stylish specs. </p><p>With that display, you get real-time conversation translation with text subtitles so you’re not having to try to listen to your smart glasses talk over the person in front of you. And the multi-modality unlocked by asking a question and just getting answers you can see makes them much more subtle. Not to say they’re perfect — the camera quality for snapping pictures suffers in low light and some features are <em>very </em>China-specific (like Alipay). But arm these with Google Gemini in setup, and they’re a genuinely helpful companion on your face for a decent price.</p><p><em><strong>Jason England, Managing Editor, Core Tech</strong></em><br>Read Jason's full <a href="https://www.tomsguide.com/computing/smart-glasses/rokid-glasses-review">Rokid Glasses review</a></p><h2 class="article-body__section" id="section-cameras-drones"><span>Cameras & drones</span></h2><h2 id="gopro-mission-1-pro"><a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-mission-1-pro-review">GoPro Mission 1 Pro</a></h2><p><strong>GoPro's return to form in the action camera game</strong><br><em>Score: </em>★★★★<strong>½</strong></p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/E2hIrAWkTQo" allowfullscreen></iframe></div></div><p>After years essentially re-releasing the same Hero cameras with minor tweaks, GoPro has finally pushed itself. The Mission 1 Pro is pricey, but it’s the first GoPro I’ve been excited about in a while. It seriously impressed me with its powerful and versatile video credentials in testing, namely open gate 8K and a wealth of shooting features that make it ideal for its target market: professionals. Thanks to revised processor architecture and a shiny new battery, I managed to extract unparalleled battery life and thermals versus other <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">action cameras</a> in my standardized battery tests. GoPro is back!</p><p><em><strong>Pete Wolinski, Senior Reviews & Cameras Editor</strong></em><br>Read Pete’s full <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-mission-1-pro-review"><u>GoPro Mission 1 Pro review</u></a></p><h2 id="dji-osmo-pocket-4"><a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review">DJI Osmo Pocket 4</a></h2><p><strong>The best all-around tool for content creation</strong><br><em>Score: </em>★★★★★</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wBTZhStFd1o" allowfullscreen></iframe></div></div><p>I awarded the DJI Osmo Pocket 4 our full five stars in my review, and that’s because I literally couldn’t find anything wrong with it. Aside from the fact that it’s not available in America (yet?) due to tariffs and DJI’s ongoing feud with the U.S. government. The Osmo Pocket 4 improved on its predecessor in every single way that mattered: video, stabilization, storage, thermals, battery life, and more. If you’re after a single tool for professional-looking content creation, I really can’t think of anything better to recommend.</p><p><em><strong>Pete Wolinski, Senior Reviews & Cameras Editor</strong></em><br>Read Pete’s full <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review"><u>DJI Osmo Pocket 4 review</u></a></p><h2 id="dji-avata-360"><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review">DJI Avata 360</a></h2><p><strong>Although a little late to the 360 party, DJI absolutely smashed it</strong><br><em>Score: </em>★★★★<strong>½</strong></p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YvK5opkgEow" allowfullscreen></iframe></div></div><p>The DJI Avata 360 does exactly what you want a drone to do: make flying fun. It stakes its claim as the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best 360° drone</a> around (granted, there are only two at the time of writing, but still!) and its twin lenses capture every single angle in 8K at 60fps. 120MP hi-res stills, user-friendly editing software, and exceptional build quality make it <em>the </em>drone to buy today. It also undercuts its main competitor, the Antigravity A1, and with dual ways to fly (FPV and with a standard controller), the Avata 360 is versatile and oh-so-powerful. Every day I still think about it — and as someone who’s tested many, many quadcopters, that’s saying a lot.</p><p><em><strong>Nikita Achanta, Senior Reviews Writer</strong></em><br>Read Nikita’s full <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review"><u>DJI Avata 360 review</u></a></p><h2 class="article-body__section" id="section-computing-gaming"><span>Computing & gaming</span></h2><h2 id="macbook-neo"><a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo</a></h2><p><strong>Our favorite budget laptop, literally ever</strong><br><em>Score: </em>★★★★<strong>½</strong></p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ISmvUpSEG-w" allowfullscreen></iframe></div></div><p>Value for money in laptops has become a bit of a running joke this year (thanks, RAMageddon). But of all the companies building notebooks, I didn’t anticipate it would be Apple to deliver the goods and give you an honest-to-god well-priced system. Yes, there’s been a $100 increase recently, but even with that, the premium aluminum build quality, great display, tactile keyboard and zippy performance of that A18 Pro makes for a great system for the day-to-day essentials. </p><p>I must admit, to see Apple actually having fun with colors in its <a href="https://www.tomsguide.com/best-picks/best-macbook">MacBooks</a> is a refreshing change from the blacks and silvers of its more expensive lineage. All of this comes together into a laptop that has terrified the budget Windows laptop market, and the best ultra portable we’ve tested this year.</p><p><em><strong>Jason England, Managing Editor, Core Tech</strong></em><br>Read our full <a href="https://www.tomsguide.com/computing/macbooks/apple-macbook-neo-review">MacBook Neo review</a></p><h2 id="asus-zenbook-duo-2026"><a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-duo-2026-review">Asus Zenbook Duo (2026)</a></h2><p><strong>Dual OLED panels = chef's kiss</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pzT2YvbKokZUz7jyHGLE59" name="Asus Zenbook Duo (2026)" alt="Asus Zenbook Duo (2026)" src="https://cdn.mos.cms.futurecdn.net/pzT2YvbKokZUz7jyHGLE59.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>Yes, this is a dual-screen OLED beauty of a premium laptop; Asus has really paid attention to the design and ergonomics of a system like this. But the real superpower is what lies inside that shell. Intel Core Ultra Series 3 (codenamed Panther Lake) has been a truly generational moment for Team Blue in its <a href="https://www.tomsguide.com/computing/laptops/best-windows-laptops">Windows laptops</a>, and it comes down to huge updates to both the performance and power efficiency. </p><p>Those new CPU cores and efficiency architecture they’re built onto gives this a gargantuan battery life that would make a MacBook blush, while the superpowered GPU (alongside XeSS 3) gives this some serious gaming laptop chops too. Usually, you had to be considerate of just <em>what </em>you wanted to do with your Windows laptop and decide on the strengths and compromises around that. With anything that sports an X9 chip like this, though, that’s no longer a compromise you have to make.</p><p><em><strong>Jason England, Managing Editor, Core Tech</strong></em><br>Read Jason's full <a href="https://www.tomsguide.com/computing/laptops/asus-zenbook-duo-2026-review">Asus Zenbook Duo (2026) review</a></p><h2 id="msi-claw-8-ex-ai"><a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-review">MSI Claw 8 EX AI+</a></h2><p><strong>A true next-gen gaming handheld</strong><br><em>Score: </em>★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vUZrRde9zCurFLDzUsKCZe" name="MSI Claw 8 EX AI+" alt="MSI Claw 8 EX AI+" src="https://cdn.mos.cms.futurecdn.net/vUZrRde9zCurFLDzUsKCZe.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 MSI Claw 8 EX AI+ delivers the performance jump I’ve been waiting years for. With Intel’s new Arc G3 Extreme chip, games are pulling a 20 to 30+ FPS advantage over AMD Z2 Extreme handhelds. Battery life gets a big boost too. I could hit the same performance as the Z2 Extreme at half the power consumption. Combine that with its major redesign bringing more Xbox-like controls, better haptics, and its large 8-inch 16:10 display, and you’re getting, in my opinion, one of the <a href="https://www.tomsguide.com/round-up/best-handheld-gaming-consoles">best handheld gaming consoles</a> of 2026.</p><p><em><strong>Paul Antill, Video Producer</strong></em><br>Read our full <a href="https://www.tomsguide.com/gaming/handheld-gaming/msi-claw-8-ex-ai-plus-review">MSI Claw 8 EX AI+ review</a></p><h2 id="007-first-light"><a href="https://www.tomsguide.com/gaming/007-first-light-review">007 First Light</a></h2><p><strong>Forget GoldenEye: this is the best Bond game ever</strong><br><em>Score: </em>★★★★★</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bSj9Dci8XztAKmNPsWEXob" name="007-first-light-screenshot-ps5-pro-08.JPG" alt="007 First Light screenshot taken on PS5 Pro" src="https://cdn.mos.cms.futurecdn.net/bSj9Dci8XztAKmNPsWEXob.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: IO Interactive)</span></figcaption></figure><p>Gamers are being treated to a licensed games renaissance right now. The days of cheap cash-ins launched to coincide with a new blockbuster movie are over. But even in this golden era for video games based on popular media franchises, 007 First Light surpasses expectations. </p><p>Forget GoldenEye, First Light is the best James Bond game ever. With its ludicrously cinematic gameplay, compelling narrative that focuses on a younger Bond (played by Patrick Gibson), and deep commitment to authenticity, 007 First Light is easily the best thing to come out of this long-running spy series in 20 years, movies included. There’s a reason it was only the second video game I’ve given the full five stars. Whether you’re a longtime Bond fan or a newcomer, 007 First Light is quite simply unmissable.</p><p><em><strong>Rory Mellon, Senior Entertainment Editor</strong></em><br>Read Rory's full <a href="https://www.tomsguide.com/gaming/007-first-light-review">007 First Light review</a></p><h2 id="epomaker-glyph"><a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review">Epomaker Glyph</a></h2><p><strong>Nikita's dream keyboard</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sjAcau9VseSqLieN8EcHke" name="Epomaker_Glyph" alt="An Epomaker Glyph mechanical keyboard" src="https://cdn.mos.cms.futurecdn.net/sjAcau9VseSqLieN8EcHke.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve tested close to 100 <a href="https://www.tomsguide.com/best-picks/best-mechanical-keyboards">keyboards</a> in my time as a reviews writer, and it isn’t often that I get to proclaim, “I’ve found my dream keyboard.” Ever since I tested the Epomaker Glyph, it hasn’t left my desk, and it’s my daily driver when I’m at the office. Typewriter-like aesthetics, a return lever that acts as an Enter or Backspace key, beautiful RGB lighting, a creamy sound profile, and a typing experience that’s nothing short of stunning — all of these characteristics come together to deliver what’s probably the best mechanical keyboard I’ve used for typing. I’m a speed demon when I’m bashing out 109 words per minute of this thing.</p><p><em><strong>Nikita Achanta, Senior Reviews Writer</strong></em><br>Read Nikita’s full <a href="https://www.tomsguide.com/computing/keyboards/epomaker-glyph-review"><u>Epomaker Glyph review</u></a></p><p><em>(A note from Nikita's editor, Pete: "I can confirm, the Glyph genuinely hasn't left her desk!")</em></p><h2 id="msi-mpg-341cqr-qd-oled-x36"><a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review">MSI MPG 341CQR QD-OLED X36</a></h2><p><strong>Pro performance for under $1,000</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LDAziKPYjRjFoYgmVRcLK8" name="MSI X36_" alt="An MSI MPG 341CQR QD-OLED X36 gaming monitor in black" src="https://cdn.mos.cms.futurecdn.net/LDAziKPYjRjFoYgmVRcLK8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s no secret that MSI knows how to make a great <a href="https://www.tomsguide.com/us/best-gaming-monitors,review-3114.html">gaming monitor</a>, and its MPG 341CQR QD-OLED X36 is one of the most beautiful displays I’ve ever tested. Blistering 360Hz refresh rate and 0.03ms response time for buttery smooth gameplay? Check. Ridiculously accurate colors and wide color coverage? Yep. AI sleep and wake features that are <em>actually </em>useful and not just a gimmick? Oh yeah. And all of this is packed into a sleek design with plenty of ports. Not much to complain about here, really.</p><p><em><strong>Nikita Achanta, Senior Reviews Writer</strong></em><br>Read Nikita’s full <a href="https://www.tomsguide.com/computing/monitors/msi-mpg-341cqr-qd-oled-x36-review"><u>MSI MPG 341CQR QD-OLED X36 review</u></a></p><h2 id="viture-beast-ar-glasses"><a href="https://www.tomsguide.com/computing/smart-glasses/viture-beast-review">Viture Beast AR glasses</a></h2><p><strong>Beast by name, beast by nature</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iTY7CiVLGP9u3qN25ZR2EW" name="Viture Beast" alt="Viture Beast" src="https://cdn.mos.cms.futurecdn.net/iTY7CiVLGP9u3qN25ZR2EW.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve traveled the world testing all of this year’s biggest AR glasses releases, and Viture Beast stands head and shoulders above the pack as the best I’ve used this year (so far). There’s three reasons why: picture quality, comfort and features. Viture’s color science and fidelity really shines in those micro-OLED displays with a massive 58-degree field of view. There’s a little edge fringing on the sides, but given the massive vision field, it’s unlikely you’ll notice it. And this is packed into a nice-feeling pair of glasses with a soft-touch coating that sits gently on your ears with optimal weight balance. Cap it all off with plenty of customization built in, plus the SpaceWalker app for multi-monitor home office setups, and the Beast are…well…pretty beastly for work and play.</p><p><em><strong>Jason England, Managing Editor, Core Tech</strong></em><br>Read Jason's full <a href="https://www.tomsguide.com/computing/smart-glasses/viture-beast-review">Viture Beast review</a></p><h2 class="article-body__section" id="section-fitness"><span>Fitness</span></h2><h2 id="fitbit-air"><a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air</a></h2><p><strong>The best Whoop alternative, and subscription-free</strong><br><em>Score: </em>★★★★<strong>☆</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width: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>The Fitbit Air is my fitness tracker of the year so far. Discreet and distraction-free (no screen), this is a fitness tracker that's easy to use, lightweight, and oh-so-comfortable. Just $99 and subscription-free for core features, it offers a week of battery life and covers all the holistic metrics you'd expect from a modern device, like heart health, sleep quality, daily movement, and workouts. For most people, this is the best screen-free fitness tracker you can buy, and the new Google Health companion app makes viewing all your health data a dream.</p><p><em><strong>Jane McGuire, Managing Editor, Fitness</strong></em><br>Read our full <a href="https://www.tomsguide.com/wellness/fitness-trackers/fitbit-air-review">Fitbit Air review</a></p><h2 id="salomon-xt-6"><a href="https://www.tomsguide.com/wellness/fitness/salomon-xt-6-review">Salomon XT-6</a></h2><p><strong>Hike, shop or relax in comfort and style</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pz558gVFyYaZd7udisT2c9" name="Salomon XT-6" alt="woman wearing Salomon XT-6 sneakers walking up a steep city hill" src="https://cdn.mos.cms.futurecdn.net/pz558gVFyYaZd7udisT2c9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Ashley Thieme)</span></figcaption></figure><p>The Salomon XT-6 shoes have become a staple in my closet. Whether I’m heading to the store or hitting up a challenging trail on the weekend, I know I’ll be supported. I wore these <a href="https://www.tomsguide.com/best-picks/best-hiking-boots">hiking sneakers</a> on a city break, where I clocked over 93,000 steps and didn’t have a single complaint. Not only that, the multidirectional lugs kept me stable on even the trickiest terrain, as I hiked in mud, over rocks, and through water. </p><p>On top of their technical ability, the XT-6s are a fashion statement, worn all over New York by fashion-forward celebs; these shoes have earned a coveted spot in my daily rotation — although you’ll find me cleaning the mud off them after each adventure.</p><p><em><strong>Ashley Thieme, Staff Writer</strong></em><br>Read Ashley’s full <a href="https://www.tomsguide.com/wellness/fitness/salomon-xt-6-review"><u>Salomon XT-6 review</u></a></p><h2 class="article-body__section" id="section-homes"><span>Homes</span></h2><h2 id="dyson-v16-piston-animal-cordless"><a href="https://www.tomsguide.com/home/home-appliances/the-dyson-v16-piston-animal-is-a-great-multi-tasker-and-handles-messes-well-but-is-it-worth-the-premium-price">Dyson V16 Piston Animal Cordless</a></h2><p><strong>A powerful cordless Dyson that's perfect for pet owners</strong><br><em>Score: </em>★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Bdv3dPcZbVhQWhaBEKzSYR" name="Dyson V16 Piston-1-LIST" alt="Dyson V16 Piston Animal" src="https://cdn.mos.cms.futurecdn.net/Bdv3dPcZbVhQWhaBEKzSYR.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ve tested my fair share of Dyson <a href="https://www.tomsguide.com/best-picks/best-vacuum-cleaners">vacuum cleaners</a> in my time, but I must say that the V16 combines all of my favorite features in one cleaner. First, its upgraded ‘Fluffy Cones’ head is designed to be used on both carpets and hard flooring without the need to swap over attachments. This is a great time-saver, and lets me quickly zip around my home without pausing. Perhaps my favorite feature is the dust-detecting green light which reveals those hidden dustballs lurking underneath furniture and in corners. Plus, it’s lightweight and easy to store, which is why it’s now my go-to  for daily maintenance, and why I awarded our Editor’s Choice badge.</p><p><em><strong>Cynthia Lawrence, Homes Editor</strong></em><br>Read Cynthia’s full <a href="https://www.tomsguide.com/home/home-appliances/the-dyson-v16-piston-animal-is-a-great-multi-tasker-and-handles-messes-well-but-is-it-worth-the-premium-price"><u>Dyson V16 Piston Animal Cordless review</u></a></p><h2 id="kitchenaid-artisan-plus"><a href="https://www.tomsguide.com/home/kitchenaid-artisan-plus-mixer-review">KitchenAid Artisan Plus</a></h2><p><strong>The latest version of KitchenAid's legendary mixer, and the best one yet</strong><br><em>Score: </em>★★★★★</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Xa7WjwjzSsdVPrfWLzzEDA" name="KitchenAid Artisan Plus stand mixer review" alt="KitchenAid Artisan Plus stand mixer review" src="https://cdn.mos.cms.futurecdn.net/Xa7WjwjzSsdVPrfWLzzEDA.jpg" mos="" align="middle" fullscreen="" width="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 / Camilla Sharman)</span></figcaption></figure><p>I got to test KitchenAid’s newest <a href="https://www.tomsguide.com/best-picks/best-stand-mixers">stand mixer</a>, the Artisan Plus, and it’s even better than I imagined. I’d been happily using KitchenAid’s Artisan stand mixer as my go-to appliance for a good few years, and I really didn’t see how it could be improved, but it has. It may only seem like a few tweaks, but they have made a big difference. From the sliding speed control that just glides, to the in-bowl light, which illuminates the mix — and let's not forget the double-edge flex beater that cleans the bowl as it sweeps past— I loved it so much during testing that I gave it a 5-star rating.</p><p><em><strong>Camilla Sharman, Staff Writer</strong></em><br>Read Camilla’s full <a href="https://www.tomsguide.com/home/kitchenaid-artisan-plus-mixer-review"><u>KitchenAid Artisan Plus review</u></a></p><h2 id="gozney-dome-xl-gen-2"><a href="https://www.tomsguide.com/home/kitchen-dining/gozney-dome-xl-2-review">Gozney Dome XL (Gen 2)</a></h2><p><strong>The undisputed king of pizza ovens</strong><br><em>Score: </em>★★★★★</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3916px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Ain7J5FfthYiMBYmVw63sY" name="Gozney Dome 2 pizza oven-16" alt="Gozney Dome XL gen 2" src="https://cdn.mos.cms.futurecdn.net/Ain7J5FfthYiMBYmVw63sY.jpg" mos="" align="middle" fullscreen="" width="3916" height="2203" attribution="" endorsement="" 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’re a dedicated — and I mean dedicated — at-home pizza maker, the Gozney Dome XL (Gen 2) is the closest you’ll come to actually building a <a href="https://www.tomsguide.com/best-picks/best-outdoor-pizza-ovens">pizza oven</a> from scratch. It can run on either gas, wood, or charcoal, has dual temperature probes, and is big enough to fit a 16-inch pie with room to spare. I loved its easy-to-ready displays, and the design of the oven is just gorgeous, too. Yes, it’s huge and it’s expensive (I’ve made equally good pizzas in much cheaper ovens), but this is the oven that’ll signal you’re the real pizzaiolo in your neighborhood. </p><p><em><strong>Mike Prospero, U.S. Editor-in-chief</strong></em><br>Read Mike’s full <a href="https://www.tomsguide.com/home/kitchen-dining/gozney-dome-xl-2-review"><u>Gozney Dome XL (Gen 2) review</u></a></p><h2 id="fellow-espresso-series-1"><a href="https://www.tomsguide.com/home/coffee-makers/fellow-espresso-series-1-review">Fellow Espresso Series 1</a></h2><p><strong>Beginners or pros, coffee snobs or otherwise — this one is for everyone</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1980px;"><p class="vanilla-image-block" style="padding-top:56.21%;"><img id="kxPQL4RdbUAPhcdc3CdYdP" name="" alt="Coffee tech from the London Coffee Festival" src="https://cdn.mos.cms.futurecdn.net/kxPQL4RdbUAPhcdc3CdYdP.jpg" mos="" align="middle" fullscreen="" width="1980" height="1113" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When Fellow designed the Espresso Series 1, it looked at the other <a href="https://www.tomsguide.com/home/coffee-makers/best-espresso-machines">espresso machines</a> out there and thought, “I’m going to do something different.” And <em>different</em> the Espresso Series 1 is. When I tested this machine, I loved that it provided coffee-snob-approved features while still being usable for complete beginners. On top of having a litany of customization options on the machine itself, I loved having the app, which walked me through how to make every type of coffee ever invented. You may think this is too ambitious, but for me, the Espresso Series 1 hits all its marks and comes out victorious. </p><p><em><strong>Erin Bashford, Senior Reviews Writer</strong></em><br>Read Erin’s full <a href="https://www.tomsguide.com/home/coffee-makers/fellow-espresso-series-1-review"><u>Fellow Espresso Series 1 review</u></a></p><h2 class="article-body__section" id="section-phones"><span>Phones</span></h2><h2 id="apple-iphone-17"><a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">Apple iPhone 17</a></h2><p><strong>A surprisingly solid update over the previous generation</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fXQyeewX6f4cMRqqSucB2D" name="iphone17-1 (2)-2" alt="Sage iPhone 17 in hand" src="https://cdn.mos.cms.futurecdn.net/fXQyeewX6f4cMRqqSucB2D.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>Apple launched more new <a href="https://www.tomsguide.com/best-picks/best-phones">phones</a> than in any previous year, but the iPhone 17 remains my favorite for several reasons. One thing that makes it stand out is that it finally got a long-overdue upgrade to a 120Hz refresh rate, making its screen look even more fluid than before in testing. On top of that, I really love how it didn’t get a price hike and still managed to get double the starting storage.</p><p><em><strong>John Velasco, Senior Phones Editor</strong></em><br>Read John's full <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-17-review">iPhone 17 review</a></p><h2 id="samsung-galaxy-s26-ultra"><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a></h2><p><strong>The phone that'll get better over time</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3718px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="XqcuYqJmZMz9675qPoSe9L" name="Galaxy S26 Ultra review-LIST3" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/XqcuYqJmZMz9675qPoSe9L.jpg" mos="" align="middle" fullscreen="" width="3718" height="2091" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When it comes to <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">Android phones</a>, nothing caught my eye more than the Galaxy S26 Ultra. Samsung’s flagship received all the iterative updates it deserved, but one particular new feature stood out most: the <a href="https://www.tomsguide.com/phones/samsung-phones/the-galaxy-s26-ultras-privacy-display-is-more-exciting-to-me-than-any-ai-feature">Privacy Display.</a> It works like magic, making the screen look dark when someone tries to peek at it from the side. You can even customize it to block out specific parts of the display — like when you’re messaging someone. This exclusive feature is what sets it apart from everything else.</p><p><em><strong>John Velasco, Senior Phones Editor</strong></em><br>Read our full <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra review</a></p><h2 class="article-body__section" id="section-sleep"><span>Sleep</span></h2><h2 id="saatva-zenhaven-mattress"><a href="https://www.tomsguide.com/mattresses/saatva-zenhaven-latex-mattress-review">Saatva Zenhaven Mattress</a></h2><p><strong>What you should be sleeping on in 2026</strong><br>Score: ★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:56.40%;"><img id="TFabSzYttYMuHXjaezHjp5" name="Saatva Zenhaven Latex mattress in situ in Tom's Guide tester's bedroom." alt="A Saatva Zenhaven Latex mattress in situ in Tom's Guide tester's bedroom." src="https://cdn.mos.cms.futurecdn.net/TFabSzYttYMuHXjaezHjp5.jpg" mos="" align="middle" fullscreen="" width="4000" height="2256" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future/Alex Temblador)</span></figcaption></figure><p>The Saatva Zenhaven latex <a href="https://www.tomsguide.com/uk/mattresses/best-mattress">mattress</a> blew our socks off during testing, thanks to its naturally cooling and supportive sleep feel for eco-conscious shoppers. Handcrafted in the US from (mostly) organic materials, the Zenhaven boasts a flippable design with a different tension on each side: Luxury Plush and Gentle Firm. We appreciated how one side boasted more cushioning for side sleepers, while the unyielding feel of the firmer side best-suited back and stomach sleepers. At $3,549 at full MSRP it’s a splurge, but cheaper during <a href="https://www.tomsguide.com/deals/saatva-mattress-deals"><u>Saatva mattress sales</u></a>. However, it’s worth noting that latex mattresses can last up to 20 years, so we think it’s worth the investment.</p><p><em><strong>Nicola Appleton, Sleep Editor</strong></em><br>Read our full <a href="https://www.tomsguide.com/mattresses/saatva-zenhaven-latex-mattress-review"><u>Saatva Zenhaven Mattress review</u></a></p><h2 id="fitnexa-somnipods-3"><a href="https://www.tomsguide.com/wellness/sleep-tech/fitnexa-somnipods-3-review">Fitnexa SomniPods 3</a></h2><p><strong>If you struggle sleeping, these earbuds are for you</strong><br><strong>Score: </strong>★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:748px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="SkZZeo9JyoBnQLVZgqU8FB" name="fitnexa_Crop" alt="Fitnexa Somnipods 3" src="https://cdn.mos.cms.futurecdn.net/v2/t:110,l:226,cw:748,ch:421,q:80/SkZZeo9JyoBnQLVZgqU8FB.jpg" mos="" align="middle" fullscreen="" width="1117" height="628" attribution="" endorsement="" 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 Fitnexa SomniPods 3 are compact <a href="https://www.tomsguide.com/wellness/sleep-tech/best-sleep-headphones">sleep earbuds</a> that helped me sleep better in even the most disruptive environments (like my neighbor's son playing basketball at unsociable hours). Fitted with built-in white noise, excellent active noise cancelation, plus sleep tracking features, they’re an easy recommendation for any troubled sleepers. But the real stand-out feature for me is the Fitnexa app. Here, your own AI coach waits for you, ready to provide personalized advice based on your sleep tracking data, activity logs and food diaries. The info isn’t quite on par with a qualified sleep professional but thanks to the wealth of data to draw from, it was pretty spot on in testing, helping take the SomniPods from sleep earbud to all-round sleep enhancer.</p><p><em><strong>Ruth Jones, Senior Sleep Writer</strong></em><br>Read Ruth's full <a href="https://www.tomsguide.com/wellness/sleep-tech/fitnexa-somnipods-3-review"><u>Fitnexa SomniPods 3 review</u></a></p><h2 class="article-body__section" id="section-smart-home-security"><span>Smart home & security</span></h2><h2 id="blink-battery-doorbell-2k"><a href="https://www.tomsguide.com/home/smart-home/the-blink-battery-doorbell-2k-checks-all-of-the-boxes-for-a-budget-friendly-video-doorbell">Blink Battery Doorbell 2K+</a></h2><p><strong>A fantastic way to improve security on a budget</strong><br>Score: ★★★★☆</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="yZAvTAEWArFc8txHT9dPfE" name="Blink-Battery-Doorbell-2K+--4" alt="Blink Battery Doorbell 2K+ with app" src="https://cdn.mos.cms.futurecdn.net/yZAvTAEWArFc8txHT9dPfE.jpg" mos="" align="middle" fullscreen="" width="2000" height="1126" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Blink has long been one of our favorite budget smart home brands, and its newest battery-powered <a href="https://www.tomsguide.com/us/best-video-doorbells,review-4468.html">video doorbell</a> furthers its reputation as a value leader. The Battery Doorbell 2K+ delivered very good 2K video in our testing — not the tops, but for a sub-$100 device it was more than acceptable. And, while it runs on AA batteries, they’ll last up to two years on a charge. You can also use this video doorbell without a subscription (you’ll need to purchase a separate adapter), but Blink’s subscription price is relatively affordable. </p><p><em><strong>Mike Prospero, U.S. Editor-in-chief</strong></em><br>Read our full <a href="https://www.tomsguide.com/home/smart-home/the-blink-battery-doorbell-2k-checks-all-of-the-boxes-for-a-budget-friendly-video-doorbell"><u>Blink Battery Doorbell 2K+ review</u></a></p><h2 class="article-body__section" id="section-tv-audio"><span>TV & Audio</span></h2><h2 id="samsung-s95h-oled"><a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s95h-oled-tv-review">Samsung S95H OLED</a></h2><p><strong>Supreme picture quality, even in bright rooms</strong><br><em>Score: </em>★★★★★</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jqM4wzaAhBUkmZbniDKoy9" name="Samsung-S95H--3" alt="Samsung S95H OLED TV on a desk" src="https://cdn.mos.cms.futurecdn.net/jqM4wzaAhBUkmZbniDKoy9.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve tested countless <a href="https://www.tomsguide.com/us/best-tvs,review-2224.html">TVs</a>, but the Samsung S95H is the first unit in several years that truly surpassed all my expectations. It completely shatters the familiar rules of OLED, obliterating ambient glare and delivering an unprecedented, jaw-dropping brightness in the self-emissive category. Even the floating metal bezel (a design choice I fully assumed I'd hate) adds a striking, premium presence I grew to love. Between its breathtaking performance and how seamlessly it transitions into a decor piece via Samsung Art Store support, this is a flagship that stands as a definitive standard-bearer.</p><p><em><strong>Kate Kozuch, Managing Editor</strong></em><br>Read Kate's full <a href="https://www.tomsguide.com/tvs/oled-tvs/samsung-s95h-oled-tv-review">Samsung S95H OLED review</a></p><h2 id="airpods-max-2"><a href="https://www.tomsguide.com/audio/headphones/apple-airpods-max-2-review">AirPods Max 2</a></h2><p><strong>Everything is dialed up to 11</strong><br>Score: ★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SusawEdjBMCisMriTJVuRF" name="AirpodsMax2_13.JPG" alt="the apple airpods max 2 in blue photographed against a blue tom's guide background, showing the mesh headband, anodized aluminum ear cups, carry case, and controls" src="https://cdn.mos.cms.futurecdn.net/SusawEdjBMCisMriTJVuRF.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s impossible to be a tech lover and <em>not</em> have strong opinions about Apple’s new AirPods Max 2. Some people love them, some people hate them, but I’m firmly in the first camp. The AirPods Max 2 are <a href="https://www.tomsguide.com/best-picks/best-over-ear-headphones">headphones</a> that know what they’re about, and they’re not apologizing for it. With gorgeous anodized aluminum ear cups and an all-metal headband, they’re not the lightest cans in the world, but the sound more than makes up for it. </p><p>Every detail is clear, mids are melodic and vivacious, and the bass is balanced, rich, and warm. Of course, you’ve also got industry-leading smart tech features like Live Translation and integrated Siri, but Apple users looking for the best headphones need look no further than Apple’s own.</p><p><em><strong>Erin Bashford, Senior Reviews Writer</strong></em><br>Read Erin’s full <a href="https://www.tomsguide.com/audio/headphones/apple-airpods-max-2-review"><u>Apple AirPods Max 2 review</u></a></p><h2 id="beyerdynamic-amiron-zero"><a href="https://www.tomsguide.com/audio/earbuds/beyerdynamic-amiron-zero-review">Beyerdynamic Amiron ZERO</a></h2><p><strong>Open earbuds that make no sacrifices</strong><br><em>Score</em>: ★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RsTfNvY499tyUtwscUGaza" name="beyerdynamic amiron zero" alt="beyerdynamic amiron zero" src="https://cdn.mos.cms.futurecdn.net/RsTfNvY499tyUtwscUGaza.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></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 Beyerdynamic Amiron ZERO have completely changed the way I think about <a href="https://www.tomsguide.com/us/best-wireless-earbuds,review-6160.html">open-earbuds</a> (and I’ve tested a lot). Up until testing the ZEROs, I’d accepted that if I wanted ambient awareness, comfort and stability while working out, I’d need to sacrifice sound quality — but they prove that’s not the case. They provided me with the detailed listening experience I love from Beyerdynamic’s other headphones, without compromising bass performance, delivering perfectly balanced sound. I wear them when I’m working, running, or hiking in the rain (thanks to IP54 durability). They’re the only open earbuds I’ve tested with no compromises.</p><p><em><strong>Ashley Thieme, Staff Writer</strong></em><br>Read Ashley’s full <a href="https://www.tomsguide.com/audio/earbuds/beyerdynamic-amiron-zero-review"><u>Beyerdynamic Amiron ZERO review</u></a></p><h2 id="jbl-xtreme-5"><a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-xtreme-5-review">JBL Xtreme 5</a></h2><p><em><strong>The</strong></em><strong> party speaker for summer 2026</strong><br><em>Score: </em>★★★★<strong>½</strong></p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4956px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="MhmJUtGJcUZLnrZejP3SpU" name="Xtreme5-edit" alt="the jbl xtreme 5 with water splashing on it outside in the park showing its waterproofing" src="https://cdn.mos.cms.futurecdn.net/MhmJUtGJcUZLnrZejP3SpU.jpg" mos="" align="middle" fullscreen="" width="4956" height="2788" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Erin Bashford)</span></figcaption></figure><p>The JBL Xtreme 5 came, it saw, and it conquered. JBL really understood the assignment with the surprise follow-up to 2024’s Xtreme 4. Everything about the Xtreme 5 oozes confidence: the deft, controlled bass that’ll have your floorboards shaking and your bones quaking; the literally unbeatable IP68 rating that protects it against rain, sand, and drops; the gorpcore, utilitarian design; and of course the rugged 24-hour battery life. This is <em>the</em> party speaker of 2026. I’ve tested hundreds of audio products and <a href="https://www.tomsguide.com/us/best-bluetooth-speakers,review-1982.html">Bluetooth speakers</a>, but the Xtreme 5 is a special one. </p><p><em><strong>Erin Bashford, Senior Reviews Writer</strong></em><br>Read Erin’s full <a href="https://www.tomsguide.com/audio/bluetooth-speakers/jbl-xtreme-5-review"><u>JBL Xtreme 5 review</u></a></p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/reviews">See all Tom's Guide Reviews coverage</a></li><li><a href="https://www.tomsguide.com/savings-squad">Find deals fast with the Tom's Guide Savings Squad</a></li><li><a href="https://www.tomsguide.com/best-picks">Check out all of our Best Picks pages</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The Potensic Atom 3 is a great beginner drone — but here’s why I think you should buy these DJI alternatives instead ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/the-potensic-atom-3-is-a-great-beginner-drone-but-heres-why-i-think-you-should-buy-these-dji-alternatives-instead</link>
                                                                            <description>
                            <![CDATA[ I've enjoyed testing the Potensic Atom 3 and though it's a capable beginner drone, it pales in comparison to these DJI drones. Here's why. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">r9f5Zfs2xqvKWzzwkQo7pD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/2EbJoewwzUzUwwqxhEbVgL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 04 Jul 2026 08:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/2EbJoewwzUzUwwqxhEbVgL-1280-80.jpg">
                                                            <media:credit><![CDATA[Nikita Achanta / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Potensic Atom 3 in the air]]></media:description>                                                            <media:text><![CDATA[Potensic Atom 3 in the air]]></media:text>
                                <media:title type="plain"><![CDATA[Potensic Atom 3 in the air]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/2EbJoewwzUzUwwqxhEbVgL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>My job is very cool. I get to test the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> which means that not only do I get to spend time in the great outdoors, but I also get to capture some incredible shots from a bird’s-eye view. You’re spoilt for choice these days as there are some incredible quadcopters available — for every budget.</p><p>DJI is, naturally, the first name that comes to mind when you hear the word “drone.” But DJI’s drones have been facing lots of scrutiny <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">due to the ongoing ban on its quadcopters</a>. But DJI isn’t the only drone manufacturer out there — just take a look at Potensic. I’ve recently finished testing the <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-3-review">Potensic Atom 3</a>, a drone that hopes to go toe-to-toe with the DJI Lito X1, and it's excellent for beginners.</p><div class="product"><a data-dimension112="acf98550-b36e-4d3b-abcd-3de4c9142ed8" data-action="Deal Block" data-label="The Potensic Atom 3 is lightweight yet sturdy, feels more premium, and it boasts class-leading flight time. Capable of recording stable 4K video at 60fps and capturing 50MP JPEG and RAW stills, as well as boasting great AI subject tracking, the Atom 3 is a powerful drone that doesn’t give you much to complain about." data-dimension48="The Potensic Atom 3 is lightweight yet sturdy, feels more premium, and it boasts class-leading flight time. Capable of recording stable 4K video at 60fps and capturing 50MP JPEG and RAW stills, as well as boasting great AI subject tracking, the Atom 3 is a powerful drone that doesn’t give you much to complain about." data-dimension25="$429" href="https://www.amazon.com/Potensic-Transmission-Med-Tele-QuickShots-Standard/dp/B0H14KR92T/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1450px;"><p class="vanilla-image-block" style="padding-top:97.45%;"><img id="2WeRGgA6asjvme4Z4D3J2Z" name="Potensic-Atom3-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/2WeRGgA6asjvme4Z4D3J2Z.jpg" mos="" align="middle" fullscreen="" width="1450" height="1413" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Potensic Atom 3 is lightweight yet sturdy, feels more premium, and it boasts class-leading flight time. Capable of recording stable 4K video at 60fps and capturing 50MP JPEG and RAW stills, as well as boasting great AI subject tracking, the Atom 3 is a powerful drone that doesn’t give you much to complain about.<a class="view-deal button" href="https://www.amazon.com/Potensic-Transmission-Med-Tele-QuickShots-Standard/dp/B0H14KR92T/" target="_blank" rel="nofollow" data-dimension112="acf98550-b36e-4d3b-abcd-3de4c9142ed8" data-action="Deal Block" data-label="The Potensic Atom 3 is lightweight yet sturdy, feels more premium, and it boasts class-leading flight time. Capable of recording stable 4K video at 60fps and capturing 50MP JPEG and RAW stills, as well as boasting great AI subject tracking, the Atom 3 is a powerful drone that doesn’t give you much to complain about." data-dimension48="The Potensic Atom 3 is lightweight yet sturdy, feels more premium, and it boasts class-leading flight time. Capable of recording stable 4K video at 60fps and capturing 50MP JPEG and RAW stills, as well as boasting great AI subject tracking, the Atom 3 is a powerful drone that doesn’t give you much to complain about." data-dimension25="$429">View Deal</a></p></div><p>The Atom 3 improves on its predecessor, the <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review">Atom 2</a>, by introducing 4K/60fps video and 50MP RAW output, making it great for color grading and flexibility in post-production. I awarded it 4-stars in my <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-3-review">Atom 3 review</a>, and while I think it’s a capable quadcopter, I’m not convinced it’s <em>the </em>best beginner drone right now… and I’d still spend on DJI.</p><h2 id="what-s-good-about-the-potensic-atom-3">What’s good about the Potensic Atom 3?</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/TicKrUWazKg" allowfullscreen></iframe></div></div><p>Good things first. The Potensic Atom 3 features a 1/1.3-inch CMOS sensor, which is larger than the 1/2-inch sensor on the Atom 2. While the Atom 2 could shoot 4K video at 30fps, the Atom 3 can do the same at 60fps, which means that motion doesn’t look as jarring anymore. And for the first time on a Potensic drone, the Atom 3 can output 50MP RAW images.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hvdPPvJevrQBBVfr5TUVnQ" name="Potensic_Atom_3" alt="Potensic Atom 3 4K drone" src="https://cdn.mos.cms.futurecdn.net/hvdPPvJevrQBBVfr5TUVnQ.jpg" mos="" align="middle" fullscreen="" width="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 Atom 3 also introduces the new RC PTD2 controller, so you don’t need to rely on using your smartphone as a screen anymore. The controller’s 5.5-inch touchscreen is bright at 900 nits and is easy to view and read in even direct sunlight. Flight distance has been upped from 6.21 miles on the Atom 2 to 9.94 miles on the Atom 3, too.</p><p>Lastly, the Atom 3 boasts class-leading battery life. Using the Smart Battery, you can fly for 40 minutes, and this jumps to 50 minutes when using the Smart Battery Plus. The parallel charging hub is capable of charging all three batteries at the same time, and it now comes with a USB-C port instead of a proprietary one (like on the Atom 2).</p><h2 id="what-s-not-so-great">What’s not so great?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qtCuNnmzpWPNhB5yS9DSZS" name="Potensic_Atom_3" alt="Potensic Atom 3 4K drone" src="https://cdn.mos.cms.futurecdn.net/qtCuNnmzpWPNhB5yS9DSZS.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You can probably tell by now that I really like the Potensic Atom 3 — after all, I awarded it 4-stars. But the thing is, it could have very easily been a 4.5-star product… if it weren’t for its fairly significant drawbacks. <strong>My biggest gripe with the Atom 3 is its lack of obstacle avoidance</strong>. This means that the drone can’t automatically avoid obstacles in its way.</p><p>I wouldn’t have marked the Atom 3 down for its lack of collision avoidance if it wasn’t for its direct competitors featuring it. The similarly priced <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review">DJI Flip</a> ($439) features front-facing obstacle avoidance. Now, this isn’t as good as omnidirectional avoidance, but it is <em>something</em>, and it gives the Flip a leg-up over the Atom 3. The <a href="https://www.amazon.co.uk/DJI-Beginner-Friendly-ActiveTrack-Lightweight-Transmission/dp/B0FZ9XSKKD/" target="_blank" rel="nofollow">DJI Lito X1</a> (£369), on the other hand, <em>does </em>feature omnidirectional collision sensors — but unfortunately, it isn’t available in the U.S. at the time of writing.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Qm6vdttfQBo" allowfullscreen></iframe></div></div><p>My other primary issue with the Atom 3 is its poor low-light performance. Even though it features a 1/1.3-inch sensor, its aperture has been narrowed to f/2.8 from f/1.8 on the Atom 2, and it struggles in dimly lit environments. You’ll find the full explanation in my <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-3-review">Atom 3 review</a> but to sum it up: <strong>the Atom 3’s AI Night Mode, which is a big part of its advertisements, is simply not good enough</strong>. It overexposes the video so the “AI processed” video ends up looking a little fake. It drops the frame rate down to 25fps too, resulting in a fair amount of motion blur.</p><p>And of course, because there’s no obstacle avoidance, I wouldn’t recommend flying in low-light environments anyway, because visibility is already extremely low, and you may not always be able to maintain visual line of sight (VLOS).</p><h2 id="what-i-d-buy-instead">What I’d buy instead</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KhbYYckf4bDhiqo5o36meL" name="Potensic_Atom_3-2" alt="Potensic Atom 3 in the air" src="https://cdn.mos.cms.futurecdn.net/KhbYYckf4bDhiqo5o36meL.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>If you’re okay with the lack of obstacle avoidance and poor low-light performance, then by all means, get the Potensic Atom 3. Everything else it offers is excellent and the drone doesn’t give you much else to complain about.</p><p>But if those are deal-breakers for you, you’ve come to the right place. Here are the DJI drones with better features I’d buy instead — and most of them are still available in the U.S.!</p><div class="product"><a data-dimension112="3b92c794-c50e-4006-a225-462de08a8471" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$759" href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XJ7W9M/" 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:94.80%;"><img id="oey3DVjRPNTJAX3h9syZuD" name="DJI-Mini-5-Pro deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oey3DVjRPNTJAX3h9syZuD.jpg" mos="" align="middle" fullscreen="" width="1500" height="1422" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review" data-dimension112="3b92c794-c50e-4006-a225-462de08a8471" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$759">DJI Mini 5 Pro</a> sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor.<a class="view-deal button" href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow" data-dimension112="3b92c794-c50e-4006-a225-462de08a8471" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$759">View Deal</a></p></div><div class="product"><a data-dimension112="00ae3de7-ee29-4f22-938c-a798f88f37e8" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259" href="https://www.amazon.com/DJI-ActiveTrack-Omnidirectional-Obstacle-Batteries/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1066px;"><p class="vanilla-image-block" style="padding-top:73.17%;"><img id="qR2QDyEkqYwvExK2rTT6Qe" name="DJI-Neo-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qR2QDyEkqYwvExK2rTT6Qe.png" mos="" align="middle" fullscreen="" width="1066" height="780" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review" data-dimension112="00ae3de7-ee29-4f22-938c-a798f88f37e8" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259">DJI Neo 2</a> is the best budget drone on the market right now, upstaging its predecessor in every way and doing so at (still) a low price point. Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, it makes an already formidable drone a must-have for all pilots.<a class="view-deal button" href="https://www.amazon.com/DJI-ActiveTrack-Omnidirectional-Obstacle-Batteries/dp/B0FJ1S18HF/" target="_blank" rel="nofollow" data-dimension112="00ae3de7-ee29-4f22-938c-a798f88f37e8" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259">View Deal</a></p></div><div class="product"><a data-dimension112="63ff7750-9970-49ee-aba1-36e1ebdfb923" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$349" href="https://www.amazon.com/DJI-Stabilization-44000ft-Transmission-Intelligent/dp/B0DJ1H6KCP/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1438px;"><p class="vanilla-image-block" style="padding-top:100.14%;"><img id="ETuF4Lpck8ZdBpTP77vEiU" name="DJI Flip deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ETuF4Lpck8ZdBpTP77vEiU.png" mos="" align="middle" fullscreen="" width="1438" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review" data-dimension112="63ff7750-9970-49ee-aba1-36e1ebdfb923" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$349">DJI Flip</a> is a solid mid-range drone, perfect for those looking to upgrade from older DJI models. It captures detailed 48MP stills in all lighting conditions, and records gorgeous 4K/60fps footage. It’s great for content creators as it features many shooting modes, plus it’s built really well and sports a slick design.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-44000ft-Transmission-Intelligent/dp/B0DJ1H6KCP/" target="_blank" rel="nofollow" data-dimension112="63ff7750-9970-49ee-aba1-36e1ebdfb923" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$349">View Deal</a></p></div><div class="product"><a data-dimension112="6f5b9ac3-7e53-4785-8f3e-9aa68cbca9e9" data-action="Deal Block" data-label="The DJI Lito X1 features a 1/1.3-inch CMOS sensor and can record 4K/60fps HDR video as well as capture 48MP stills. It's not available in the U.S. but if you're reading this in the U.K then for the low price of £369, you're getting omnidirectional obstacle avoidance, 52-minutes of flight time, and excellent AI subject tracking." data-dimension48="The DJI Lito X1 features a 1/1.3-inch CMOS sensor and can record 4K/60fps HDR video as well as capture 48MP stills. It's not available in the U.S. but if you're reading this in the U.K then for the low price of £369, you're getting omnidirectional obstacle avoidance, 52-minutes of flight time, and excellent AI subject tracking." data-dimension25="£369" href="https://www.amazon.co.uk/DJI-Beginner-Friendly-ActiveTrack-Lightweight-Transmission/dp/B0FZ9XSKKD/" 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:51.33%;"><img id="Pw4RYSZZauxj8oLBpZx5e9" name="DJI Lito X1 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Pw4RYSZZauxj8oLBpZx5e9.jpg" mos="" align="middle" fullscreen="" width="1500" height="770" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Lito X1 features a 1/1.3-inch CMOS sensor and can record 4K/60fps HDR video as well as capture 48MP stills. It's not available in the U.S. but if you're reading this in the U.K then for the low price of £369, you're getting omnidirectional obstacle avoidance, 52-minutes of flight time, and excellent AI subject tracking.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Beginner-Friendly-ActiveTrack-Lightweight-Transmission/dp/B0FZ9XSKKD/" target="_blank" rel="nofollow" data-dimension112="6f5b9ac3-7e53-4785-8f3e-9aa68cbca9e9" data-action="Deal Block" data-label="The DJI Lito X1 features a 1/1.3-inch CMOS sensor and can record 4K/60fps HDR video as well as capture 48MP stills. It's not available in the U.S. but if you're reading this in the U.K then for the low price of £369, you're getting omnidirectional obstacle avoidance, 52-minutes of flight time, and excellent AI subject tracking." data-dimension48="The DJI Lito X1 features a 1/1.3-inch CMOS sensor and can record 4K/60fps HDR video as well as capture 48MP stills. It's not available in the U.S. but if you're reading this in the U.K then for the low price of £369, you're getting omnidirectional obstacle avoidance, 52-minutes of flight time, and excellent AI subject tracking." data-dimension25="£369">View Deal</a></p></div><div class="product"><a data-dimension112="42a4827c-4950-4bb0-834a-29b587990b44" data-action="Deal Block" data-label="Another U.K option is the DJI Lito 1, which features omnidirectional obstacle sensing, a 1/2-inch CMOS sensor, 4K/60fps capabilities, and it can capture 12MP images. There's also an 8K image mode that effectively captures 48MP stills. You can also record 4K/100fps slow motion video on it." data-dimension48="Another U.K option is the DJI Lito 1, which features omnidirectional obstacle sensing, a 1/2-inch CMOS sensor, 4K/60fps capabilities, and it can capture 12MP images. There's also an 8K image mode that effectively captures 48MP stills. You can also record 4K/100fps slow motion video on it." data-dimension25="£299" href="https://www.amazon.co.uk/DJI-Beginner-Friendly-ActiveTrack-Lightweight-Transmission/dp/B0G6Z64P3W/" 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:51.40%;"><img id="7vyJ9nXLDgUHuAkJyqhcAQ" name="DJI Lito 1 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/7vyJ9nXLDgUHuAkJyqhcAQ.jpg" mos="" align="middle" fullscreen="" width="1500" height="771" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Another U.K option is the DJI Lito 1, which features omnidirectional obstacle sensing, a 1/2-inch CMOS sensor, 4K/60fps capabilities, and it can capture 12MP images. There's also an 8K image mode that effectively captures 48MP stills. You can also record 4K/100fps slow motion video on it.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Beginner-Friendly-ActiveTrack-Lightweight-Transmission/dp/B0G6Z64P3W/" target="_blank" rel="nofollow" data-dimension112="42a4827c-4950-4bb0-834a-29b587990b44" data-action="Deal Block" data-label="Another U.K option is the DJI Lito 1, which features omnidirectional obstacle sensing, a 1/2-inch CMOS sensor, 4K/60fps capabilities, and it can capture 12MP images. There's also an 8K image mode that effectively captures 48MP stills. You can also record 4K/100fps slow motion video on it." data-dimension48="Another U.K option is the DJI Lito 1, which features omnidirectional obstacle sensing, a 1/2-inch CMOS sensor, 4K/60fps capabilities, and it can capture 12MP images. There's also an 8K image mode that effectively captures 48MP stills. You can also record 4K/100fps slow motion video on it." data-dimension25="£299">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exVPlO"></div>                            </div>                            <script src="https://kwizly.com/embed/exVPlO.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/cameras-photography/drones/potensic-atom-3-review">I’ve spent two weeks testing the new Potensic Atom 3 — and this DJI alternative is one of the best beginner drones you can buy today</a></li><li><a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4p-first-impressions">The DJI Osmo Pocket 4 is already getting an update — I spent 3 days with the Osmo Pocket 4P in Malta and here's what I'm allowed to tell you (with sample footage!)</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">The best drones in 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The DJI Osmo Pocket 4 is already getting an update — I spent 3 days with the Osmo Pocket 4P in Malta and here's what I'm allowed to tell you (with sample footage!) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4p-first-impressions</link>
                                                                            <description>
                            <![CDATA[ I spent three days recording the sights and sounds of Malta on the DJI Osmo Pocket 4P, and the footage I captured is nothing short of beautiful. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">6HGJWCDsgxAkUzPqiVfKRB</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/maeyz6sjXJLSFfBVDYQRfE-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 29 Jun 2026 10:41:41 +0000</pubDate>                                                                                                                                <updated>Mon, 29 Jun 2026 13:10:52 +0000</updated>
                                                                                                                                            <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/maeyz6sjXJLSFfBVDYQRfE-1280-80.jpg">
                                                            <media:credit><![CDATA[Nikita Achanta / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A black DJI Osmo Pocket 4P gimbal camera]]></media:description>                                                            <media:text><![CDATA[A black DJI Osmo Pocket 4P gimbal camera]]></media:text>
                                <media:title type="plain"><![CDATA[A black DJI Osmo Pocket 4P gimbal camera]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/maeyz6sjXJLSFfBVDYQRfE-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The cat's out of the bag. After months of rumors and online speculation, DJI has finally unveiled the dual-camera sibling to the 5-star <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review">Osmo Pocket 4</a>. The DJI Osmo Pocket 4P is here and it's very real — I've held it, shot footage on it, and I can tell you that it's a marvellous little camera.</p><p>I've just got back from spending a few days in Malta, where I recorded the sights and sounds of the Southern European country on the Osmo Pocket 4P. For those of you who may already have heard rumblings on the internet, you'll know that the Osmo Pocket 4P is designed to go toe-to-toe with the <a href="https://www.adorama.com/insta360-luna-ultra-8k-pocket-gimbal-camera-standard-combo-black/p/instaluna01" target="_blank" rel="nofollow">Insta360 Luna Ultra</a> — Insta360's flagship dual-lens gimbal camera.</p><p>The Luna Ultra is already available to buy in the U.S. which gives it an upper-hand over the Osmo Pocket 4P. It's been a few months since the Osmo Pocket 4 came out and it still can't be bought in the U.S. <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">due to the ongoing restrictions</a> and tariffs on the brand's products by the U.S. government — so it's unlikely the Osmo Pocket 4P will become available across the pond at the same time as in Europe.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7092px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yFbdbpvn3VycBTwrRfvzMR" name="DJI Osmo Pocket 4P-3" alt="DJI Osmo Pocket 4P gimbal camera" src="https://cdn.mos.cms.futurecdn.net/yFbdbpvn3VycBTwrRfvzMR.jpg" mos="" align="middle" fullscreen="" width="7092" height="3989" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>Should the camera become available in the U.S., though, it's certainly worth buying. I can't tell you much about the camera's specs but I <em>can</em> confirm that the Osmo Pocket 4P has two lenses, one of which is a 60mm medium-telephoto.</p><p>I can't discuss resolution or frame rates, but I can tell you that the Osmo Pocket 4P features D-Log2 support as well as a whopping 17 stops of dynamic range — giving you plenty of wiggle room in post-production. Design-wise, the Osmo Pocket 4P comes in black or white, and the latter is a first for DJI.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:7419px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZvT4LkdiLmzFU46uJTpMEQ" name="DJI Osmo Pocket 4P-6" alt="DJI Osmo Pocket 4P gimbal camera" src="https://cdn.mos.cms.futurecdn.net/ZvT4LkdiLmzFU46uJTpMEQ.jpg" mos="" align="middle" fullscreen="" width="7419" height="4173" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>We don't know about pricing yet. Given that the Osmo Pocket 4 costs £429 in the U.K., and the Luna Ultra retails for <a href="https://www.adorama.com/insta360-luna-ultra-8k-pocket-gimbal-camera-standard-combo-black/p/instaluna01" target="_blank" rel="nofollow">$769 in the U.S.</a>, maybe the Osmo Pocket 4P would cost between $550 and $650.</p><p>DJI typically undercuts Insta360 (which always prices high) in all but the U.S. market, where tariffs have forced up DJI's pricing. I imagine DJI would want to undercut Insta360 here by pricing the Osmo Pocket 4P cheaper than the Luna Ultra. We've seen it with the <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a> which uses Insta360's 360° imaging tech. It came out long before the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review">DJI Avata 360</a> and it carried an exorbitant price tag ($1,599!). DJI priced its first 360° drone far cheaper than the A1, which made the Avata 360 better value for money. This is all speculation, of course, and we won't know for certain until DJI releases this information.</p><h2 id="the-sights-and-sounds-of-malta-on-the-dji-osmo-pocket-4p">The sights and sounds of Malta on the DJI Osmo Pocket 4P</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/0RR3ZHn9PIs" allowfullscreen></iframe></div></div><p>Enough talk of specs and rumors. I've shot on the DJI Osmo Pocket 4P, so what does footage look like? Stunning, in one word. Above, I've compiled a vlog of the videos I recorded in Malta so you can feast your eyes. As you can see, stabilization is fantastic; the colors appear true to life and vibrant; and the dynamic range performance is excellent. There's plenty of detail to enjoy in dark shadows, and the highlights don't appear blown out either.</p><p>That's all I can really say, and all I'm allowed to tell you, without talking about specs. We will have a full review of the Osmo Pocket 4P in the near future. In the meantime, what do you think of the video quality and the camera in general? Let me know in the comments below!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePVM1O"></div>                            </div>                            <script src="https://kwizly.com/embed/ePVM1O.js" async></script><h2 id="what-can-i-buy-right-now-if-not-the-dji-osmo-pocket-4p">What can I buy right now if not the DJI Osmo Pocket 4P?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:8160px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qCUokiPvBDuDKcMxQ6DiKP" name="DJI Osmo Pocket 4P" alt="DJI Osmo Pocket 4P gimbal camera" src="https://cdn.mos.cms.futurecdn.net/qCUokiPvBDuDKcMxQ6DiKP.jpg" mos="" align="middle" fullscreen="" width="8160" height="4590" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>Now that you've seen the footage I recorded in Malta, have I enticed you into buying the DJI Osmo Pocket 4P when it comes out? I apologize to my American comrades because I don't know whether the Osmo Pocket 4P will be available in U.S. at launch — but fret not, there are alternatives!</p><div class="product"><a data-dimension112="43ef7d2e-445b-4438-b4ed-f3bfa4ff3e20" data-action="Deal Block" data-label="Even though its successor isn't available in the U.S., the DJI Osmo Pocket 3 is still a fantastic gimbal camera. It's the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage." data-dimension48="Even though its successor isn't available in the U.S., the DJI Osmo Pocket 3 is still a fantastic gimbal camera. It's the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage." data-dimension25="$378" href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:425px;"><p class="vanilla-image-block" style="padding-top:252.00%;"><img id="A42QpbMsUGy822dgTrzqi6" name="DJI Osmo Pocket 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/A42QpbMsUGy822dgTrzqi6.jpg" mos="" align="middle" fullscreen="" width="425" height="1071" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Even though its successor isn't available in the U.S., the DJI Osmo Pocket 3 is still a fantastic gimbal camera. It's the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD/" target="_blank" rel="nofollow" data-dimension112="43ef7d2e-445b-4438-b4ed-f3bfa4ff3e20" data-action="Deal Block" data-label="Even though its successor isn't available in the U.S., the DJI Osmo Pocket 3 is still a fantastic gimbal camera. It's the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage." data-dimension48="Even though its successor isn't available in the U.S., the DJI Osmo Pocket 3 is still a fantastic gimbal camera. It's the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage." data-dimension25="$378">View Deal</a></p></div><div class="product"><a data-dimension112="9ddac6d2-5d83-4f18-88d9-63eb9ab718ef" data-action="Deal Block" data-label="The Insta360 Luna Ultra is the DJI Osmo Pocket 4P's closest rival. It packs a Leica lens with a 1-inch sensor, and captures 8K video at 30fps. Its 2-inch OLED touchscreen is detachable and can be used for remote viewing and camera control. The Luna Ultra comes in black and white." data-dimension48="The Insta360 Luna Ultra is the DJI Osmo Pocket 4P's closest rival. It packs a Leica lens with a 1-inch sensor, and captures 8K video at 30fps. Its 2-inch OLED touchscreen is detachable and can be used for remote viewing and camera control. The Luna Ultra comes in black and white." data-dimension25="$769" href="https://www.adorama.com/insta360-luna-ultra-8k-pocket-gimbal-camera-standard-combo-black/p/instaluna01" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:716px;"><p class="vanilla-image-block" style="padding-top:134.08%;"><img id="WoHznAsQer6MkADNwYLnMQ" name="Insta360 Luna Ultra_deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WoHznAsQer6MkADNwYLnMQ.png" mos="" align="middle" fullscreen="" width="716" height="960" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Insta360 Luna Ultra is the DJI Osmo Pocket 4P's closest rival. It packs a Leica lens with a 1-inch sensor, and captures 8K video at 30fps. Its 2-inch OLED touchscreen is detachable and can be used for remote viewing and camera control. The Luna Ultra comes in black and white.<a class="view-deal button" href="https://www.adorama.com/insta360-luna-ultra-8k-pocket-gimbal-camera-standard-combo-black/p/instaluna01" target="_blank" rel="nofollow" data-dimension112="9ddac6d2-5d83-4f18-88d9-63eb9ab718ef" data-action="Deal Block" data-label="The Insta360 Luna Ultra is the DJI Osmo Pocket 4P's closest rival. It packs a Leica lens with a 1-inch sensor, and captures 8K video at 30fps. Its 2-inch OLED touchscreen is detachable and can be used for remote viewing and camera control. The Luna Ultra comes in black and white." data-dimension48="The Insta360 Luna Ultra is the DJI Osmo Pocket 4P's closest rival. It packs a Leica lens with a 1-inch sensor, and captures 8K video at 30fps. Its 2-inch OLED touchscreen is detachable and can be used for remote viewing and camera control. The Luna Ultra comes in black and white." data-dimension25="$769">View Deal</a></p></div><div class="product"><a data-dimension112="49bd29bb-c9e7-4b2e-9bc7-a10b6ba4b1be" data-action="Deal Block" data-label="If you're in the U.K., the 5-star DJI Osmo Pocket 4 is a no-brainer. An upgrade from the Pocket 3 rather than a wholesale redevelopment, the new model nevertheless makes changes in all the right places to build on an already winning recipe. Video looks beautiful, stabilization and autofocus are on point, and there’s a wealth of connectivity options to make creators’ lives easier." data-dimension48="If you're in the U.K., the 5-star DJI Osmo Pocket 4 is a no-brainer. An upgrade from the Pocket 3 rather than a wholesale redevelopment, the new model nevertheless makes changes in all the right places to build on an already winning recipe. Video looks beautiful, stabilization and autofocus are on point, and there’s a wealth of connectivity options to make creators’ lives easier." data-dimension25="£429" href="https://www.amazon.co.uk/DJI-Essential-Stabilization-Lossless-14%E2%80%91Stop/dp/B0FYQ1LFFK/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:532px;"><p class="vanilla-image-block" style="padding-top:281.95%;"><img id="Ps4UtCmeJMgiqcmff4549k" name="Osmo Pocket 4 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Ps4UtCmeJMgiqcmff4549k.jpg" mos="" align="middle" fullscreen="" width="532" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're in the U.K., the 5-star DJI Osmo Pocket 4 is a no-brainer. An upgrade from the Pocket 3 rather than a wholesale redevelopment, the new model nevertheless makes changes in all the right places to build on an already winning recipe. Video looks beautiful, stabilization and autofocus are on point, and there’s a wealth of connectivity options to make creators’ lives easier.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Essential-Stabilization-Lossless-14%E2%80%91Stop/dp/B0FYQ1LFFK/" target="_blank" rel="nofollow" data-dimension112="49bd29bb-c9e7-4b2e-9bc7-a10b6ba4b1be" data-action="Deal Block" data-label="If you're in the U.K., the 5-star DJI Osmo Pocket 4 is a no-brainer. An upgrade from the Pocket 3 rather than a wholesale redevelopment, the new model nevertheless makes changes in all the right places to build on an already winning recipe. Video looks beautiful, stabilization and autofocus are on point, and there’s a wealth of connectivity options to make creators’ lives easier." data-dimension48="If you're in the U.K., the 5-star DJI Osmo Pocket 4 is a no-brainer. An upgrade from the Pocket 3 rather than a wholesale redevelopment, the new model nevertheless makes changes in all the right places to build on an already winning recipe. Video looks beautiful, stabilization and autofocus are on point, and there’s a wealth of connectivity options to make creators’ lives easier." data-dimension25="£429">View Deal</a></p></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review">I tested DJI’s new Osmo Pocket 4 — this is the only tool I'll recommend to content creators from now on</a></li><li><a href="https://www.tomsguide.com/cameras-photography/insta360s-gimbal-camera-has-just-hit-shelves-and-theres-one-factor-that-has-me-lining-up-to-purchase-one-stat">Insta360's gimbal camera has just hit shelves, and there's one factor that has me lining up to purchase one stat</a></li><li><a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">The best cameras in 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The DJI Flip just hit its lowest price — take to the skies for just $349 this Prime Day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/the-dji-flip-just-hit-its-lowest-price-take-to-the-skies-for-just-usd349-this-prime-day</link>
                                                                            <description>
                            <![CDATA[ Let your creativity take flight with these best Amazon Prime Day DJI drone deals and DJI action cam bargains. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dJRZSg8KPzEcc3TL9XtkKe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/nGUVDTSE7y6oJtz44E3Eq4-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Jun 2026 01:53:53 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Cameras &amp; Photography]]></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/nGUVDTSE7y6oJtz44E3Eq4-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Flip drone]]></media:description>                                                            <media:text><![CDATA[A DJI Flip drone]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Flip drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/nGUVDTSE7y6oJtz44E3Eq4-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been flying drones recreationally for almost a decade. It’s one of my favorite visual tools for documenting activities like snowboarding and skateboarding; I also love snapping birds-eye-view shots of cool locations. </p><p>Now, you can let your creativity take flight — for less —  thanks to Prime Day savings on the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> from DJI, no previous flying experience needed. For example, the seriously beginner-friendly DJI Flip is just <a href="https://www.amazon.com/dp/B0DJ1H6KCP?" target="_blank" rel="nofollow">$349 at Amazon</a>, its lowest price ever. And the DJI Mini 3 is just $269 or <a href="https://www.amazon.com/DJI-Mini-Lightweight-Foldable-Intelligent/dp/B0BL3T49JF/?th=1" target="_blank" rel="nofollow">35% off at Amazon</a>.</p><p>Find links to the best DJI drone deals, plus the best DJI action camera deals below. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick links</span></h3><ul><li><strong>DJI Mini 3: </strong><a href="https://www.amazon.com/DJI-Mini-Lightweight-Foldable-Intelligent/dp/B0BL3T49JF/?th=1" target="_blank" rel="nofollow"><strong>was $419 now $269 @ Amazon</strong></a></li><li><strong>DJI Flip: </strong><a href="https://www.amazon.com/dp/B0DJ1H6KCP" target="_blank" rel="nofollow"><strong>was $439 now $349 @ Amazon</strong></a></li><li><strong>DJI Osmo Action 4: </strong><a href="https://www.amazon.com/dp/B0C783YNW7?th=1" target="_blank" rel="nofollow"><strong>was $299 now $179 @ Amazon</strong></a></li><li><strong>DJI Osmo Action 6 Capture More Combo: </strong><a href="https://www.amazon.com/dp/B0GT4JVFPF?th=1" target="_blank" rel="nofollow"><strong>was $476 now $404 @ Amazon</strong></a></li><li><strong>DJI Osmo Pocket 3 Creator Combo: </strong><a href="https://www.amazon.com/DJI-Vlogging-Stabilization-Tracking-Photography/dp/B0CG19FGQ5/?th=1" target="_blank" rel="nofollow"><strong>was $629 now $512 @ Amazon</strong></a></li></ul><h3 class="article-body__section" id="section-best-dji-prime-day-deals"><span>Best DJI Prime Day deals</span></h3><div class="product"><a data-dimension112="9597e554-fb27-43f6-a5f1-a4f5fbca5d7b" data-action="Deal Block" data-label="DJI Mini 3" data-dimension48="DJI Mini 3" data-dimension25="$269" href="https://www.amazon.com/DJI-Mini-Lightweight-Foldable-Intelligent/dp/B0BL3T49JF/?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="WqvVHXNrsYwTJeVudjZ5KS" name="DJI Mini 3 deal block.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WqvVHXNrsYwTJeVudjZ5KS.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/dji-mini-3" data-dimension112="9597e554-fb27-43f6-a5f1-a4f5fbca5d7b" data-action="Deal Block" data-label="DJI Mini 3" data-dimension48="DJI Mini 3" data-dimension25="$269">DJI Mini 3</a> has been around for a little while and isn't the newest drone in the brand's Mini lineup (that'd be the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>), but with a sales price of just $269, this deal was too good not to share. After all, the Mini 3 boasts super-long flight times, up to 38 minutes, a responsive and agile flight experience, frontal accident avoidance, and the ability to shoot vertical video in 4K. <a class="view-deal button" href="https://www.amazon.com/DJI-Mini-Lightweight-Foldable-Intelligent/dp/B0BL3T49JF/?th=1" target="_blank" rel="nofollow" data-dimension112="9597e554-fb27-43f6-a5f1-a4f5fbca5d7b" data-action="Deal Block" data-label="DJI Mini 3" data-dimension48="DJI Mini 3" data-dimension25="$269">View Deal</a></p></div><div class="product"><a data-dimension112="0f051e58-2fc1-4740-bce3-2aa7a1d83cb2" data-action="Deal Block" data-label="The DJI Flip is the easiest drone to get the hang of, making it great for beginners. Full prop guards and front-facing accident avoidance mean crashes either won't happen or aren't a big deal. Flight time is an impressive 31 minutes; meanwhile, 4K/60p footage is smooth and eye-pleasing while 48MP stills are delightfully detailed." data-dimension48="The DJI Flip is the easiest drone to get the hang of, making it great for beginners. Full prop guards and front-facing accident avoidance mean crashes either won't happen or aren't a big deal. Flight time is an impressive 31 minutes; meanwhile, 4K/60p footage is smooth and eye-pleasing while 48MP stills are delightfully detailed." data-dimension25="$349" href="https://www.amazon.com/dp/B0DJ1H6KCP" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:799px;"><p class="vanilla-image-block" style="padding-top:76.47%;"><img id="GzxQt2zMfrvMGsjJXS9ZdL" name="DJI-Flip-dealbox" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GzxQt2zMfrvMGsjJXS9ZdL.png" mos="" align="middle" fullscreen="" width="799" height="611" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Flip is the easiest drone to get the hang of, making it great for beginners. Full prop guards and front-facing accident avoidance mean crashes either won't happen or aren't a big deal. Flight time is an impressive 31 minutes; meanwhile, 4K/60p footage is smooth and eye-pleasing while 48MP stills are delightfully detailed. <a class="view-deal button" href="https://www.amazon.com/dp/B0DJ1H6KCP" target="_blank" rel="nofollow" data-dimension112="0f051e58-2fc1-4740-bce3-2aa7a1d83cb2" data-action="Deal Block" data-label="The DJI Flip is the easiest drone to get the hang of, making it great for beginners. Full prop guards and front-facing accident avoidance mean crashes either won't happen or aren't a big deal. Flight time is an impressive 31 minutes; meanwhile, 4K/60p footage is smooth and eye-pleasing while 48MP stills are delightfully detailed." data-dimension48="The DJI Flip is the easiest drone to get the hang of, making it great for beginners. Full prop guards and front-facing accident avoidance mean crashes either won't happen or aren't a big deal. Flight time is an impressive 31 minutes; meanwhile, 4K/60p footage is smooth and eye-pleasing while 48MP stills are delightfully detailed." data-dimension25="$349">View Deal</a></p></div><div class="product"><a data-dimension112="dfd31414-4f5a-4ef0-8f41-e7567a2ad56e" data-action="Deal Block" data-label="Osmo Action 4" data-dimension48="Osmo Action 4" data-dimension25="$179" href="https://www.amazon.com/dp/B0C783YNW7?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="8RNoiAvEdbtYEJ6r9mu2EA" name="DJI Osmo Action 4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8RNoiAvEdbtYEJ6r9mu2EA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/dji-osmo-action-4" data-dimension112="dfd31414-4f5a-4ef0-8f41-e7567a2ad56e" data-action="Deal Block" data-label="Osmo Action 4" data-dimension48="Osmo Action 4" data-dimension25="$179">Osmo Action 4</a> isn't the newest DJI action camera, but it's still a mighty capable piece of kit for a seriously good price. Video quality is excellent; you can even shoot 4K/120p slow-motion footage. It also has full-color front and rear screens, decent internal audio, tons of mounting options, and 60 feet of water resistance, no case needed.<a class="view-deal button" href="https://www.amazon.com/dp/B0C783YNW7?th=1" target="_blank" rel="nofollow" data-dimension112="dfd31414-4f5a-4ef0-8f41-e7567a2ad56e" data-action="Deal Block" data-label="Osmo Action 4" data-dimension48="Osmo Action 4" data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="5bfc5fca-e5b2-4685-937f-9b04f22f5cff" data-action="Deal Block" data-label="DJI Osmo Action 6" data-dimension48="DJI Osmo Action 6" data-dimension25="$404" href="https://www.amazon.com/dp/B0GT4JVFPF?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1430px;"><p class="vanilla-image-block" style="padding-top:83.85%;"><img id="BsiDCToH9T6SoRKtYEgxmY" name="DJI-6-more" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BsiDCToH9T6SoRKtYEgxmY.jpg" mos="" align="middle" fullscreen="" width="1430" height="1199" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The latest DJI action camera is also on sale. Grab the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-6-review" data-dimension112="5bfc5fca-e5b2-4685-937f-9b04f22f5cff" data-action="Deal Block" data-label="DJI Osmo Action 6" data-dimension48="DJI Osmo Action 6" data-dimension25="$404">DJI Osmo Action 6</a> Capture More Combo $72 off for Prime Week. This includes the camera, two batteries, and a mountable extension rod. Moreover, the camera's 8K video quality is stunning, and image stabilization is class-leading. For hardcore creatives, it even supports interchangeable lenses. <a class="view-deal button" href="https://www.amazon.com/dp/B0GT4JVFPF?th=1" target="_blank" rel="nofollow" data-dimension112="5bfc5fca-e5b2-4685-937f-9b04f22f5cff" data-action="Deal Block" data-label="DJI Osmo Action 6" data-dimension48="DJI Osmo Action 6" data-dimension25="$404">View Deal</a></p></div><div class="product"><a data-dimension112="07615bac-ca7e-4d78-85f6-98859b19c034" data-action="Deal Block" data-label="DJI Osmo Pocket 3" data-dimension48="DJI Osmo Pocket 3" data-dimension25="$512" href="https://www.amazon.com/DJI-Vlogging-Stabilization-Tracking-Photography/dp/B0CG19FGQ5/?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:749px;"><p class="vanilla-image-block" style="padding-top:111.75%;"><img id="V3Yh26jh4QvatcmnLzvYfQ" name="Screenshot 2026-06-25 at 6.28.36 PM" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/V3Yh26jh4QvatcmnLzvYfQ.png" mos="" align="middle" fullscreen="" width="749" height="837" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3" data-dimension112="07615bac-ca7e-4d78-85f6-98859b19c034" data-action="Deal Block" data-label="DJI Osmo Pocket 3" data-dimension48="DJI Osmo Pocket 3" data-dimension25="$512">DJI Osmo Pocket 3</a> is easily one of the best hand-held vlogging cameras on the market today, with impressive 4K video, excellent stabilization, and impressive battery performance, all in a simple-to-use package. <a class="view-deal button" href="https://www.amazon.com/DJI-Vlogging-Stabilization-Tracking-Photography/dp/B0CG19FGQ5/?th=1" target="_blank" rel="nofollow" data-dimension112="07615bac-ca7e-4d78-85f6-98859b19c034" data-action="Deal Block" data-label="DJI Osmo Pocket 3" data-dimension48="DJI Osmo Pocket 3" data-dimension25="$512">View Deal</a></p></div><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Cameras+%26+Photography&price=50_100&view_mode=savings_squad&widget_title=Top+Prime+Day+phone+deals%2C+as+picked+by+us&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;">` : ''}                            \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;">` : ''}                          \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[ A lot of Prime Day action camera deals suck: These ones don't ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/prime-day-action-camera-deals-are-live-upgrade-your-content-for-less</link>
                                                                            <description>
                            <![CDATA[ There are some surprisingly good deals on action and 360 cameras this Prime Day! Here are my favorites. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">EaPRU9Lm6doCmKqikg65wj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4QRFb2Nb9SEpYeUzosLCoe-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 13:18:54 +0000</pubDate>                                                                                                                                <updated>Wed, 24 Jun 2026 08:50:49 +0000</updated>
                                                                                                                                            <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4QRFb2Nb9SEpYeUzosLCoe-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A person holding the DJI Osmo Pocket 3 in hand]]></media:description>                                                            <media:text><![CDATA[A person holding the DJI Osmo Pocket 3 in hand]]></media:text>
                                <media:title type="plain"><![CDATA[A person holding the DJI Osmo Pocket 3 in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4QRFb2Nb9SEpYeUzosLCoe-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/live/news/prime-day-2026-top-sales-now">Prime Day deals</a> are here, and yesterday I was actually pretty shocked at some of the deals — for better or worse. I'll start with the better! There are some surprisingly good deals on the <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action cameras</a> (rivalling Black Friday prices), including $200 off the GoPro MAX2 at Amazon — one of my favorite <a href="https://www.tomsguide.com/us/best-360-cameras,review-3737.html">360 cameras</a>. Meanwhile, <a href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD" target="_blank" rel="nofollow">the DJI Osmo Pocket 3 — a YouTuber's staple — is currently over $120 off at Amazon</a>. Both are quick and easy ways to upgrade your content for social or YouTube.</p><p>There are some deals to be wary of, though. The <a href="https://www.amazon.com/GoPro-HERO13-Black-Compatability-HB/dp/B0DCM34GXX/" target="_blank" rel="nofollow">GoPro Hero13 Black is <em><strong>seemingly</strong></em> reduced from $429 to $349 at Amazon</a>, which is <em><strong>seemingly</strong></em> a good discount. No! Bad deal!!!! $349 is where it sits most of the year anyway, if not lower. The price just got jacked up to $429 for a couple of weeks to catch you out!</p><p>I'm Pete, senior reviews editor here at Tom's Guide, and I've tested every major action and 360 camera launched for the last few years. I track prices all year, so I've rounded up here which deals are actually good, to help you avoid the scams.</p><p>Without further ado, here are all my favorite Prime Day action camera deals.</p><h2 class="article-body__section" id="section-quick-list"><span>Quick list</span></h2><ul><li><strong>GoPro LIT Hero: </strong><a href="https://www.amazon.com/GoPro-LIT-Hero-Built-Stabilization/dp/B0FP5R9BDZ" target="_blank" rel="nofollow"><strong>was $269 now $179 @ Amazon</strong></a><strong></strong></li><li><strong>DJI Osmo Action 4: </strong><a href="https://www.amazon.com/DJI-Waterproof-Low-Light-Performance-Long-Lasting/dp/B0C783YNW7" target="_blank" rel="nofollow"><strong>was $299 now $179 @ Amazon</strong></a><strong></strong></li><li><strong>Insta360 X3: </strong><a href="https://www.amazon.com/Insta360-Single-Lens-Stabilization-Touchscreen-Wintersports/dp/B0B9H572LC" target="_blank" rel="nofollow"><strong>was $299 now $229 @ Amazon</strong></a><strong></strong></li><li><strong>DJI Osmo Action 5 Pro: </strong><a href="https://www.amazon.com/gp/aw/d/B0DS2DF5S5" target="_blank" rel="nofollow"><strong>was $339 now $288 @ Amazon</strong></a><strong> </strong></li><li><strong>GoPro MAX2: </strong><a href="https://www.amazon.com/GoPro-MAX2-Traditional-Replaceable-Stabilization/dp/B0FNGK6JZP" target="_blank" rel="nofollow"><strong>was $499 now $299 @ Amazon</strong></a><strong></strong></li><li><strong>DJI Osmo 360: </strong><a href="https://www.amazon.com/DJI-Standard-Imaging-Recording-Waterproof/dp/B0DTTZZ6Q3/" target="_blank" rel="nofollow"><strong>was $467 now $257 @ Amazon</strong></a><strong></strong></li><li><strong>Insta360 X4 Air: </strong><a href="https://www.amazon.com/Insta360-Starter-Bundle-Built-Stabilization/dp/B0FQNWDYMS" target="_blank" rel="nofollow"><strong>was $439 now $324 @ Amazon</strong></a><strong></strong></li><li><strong>DJI Osmo Pocket 3: </strong><a href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD" target="_blank" rel="nofollow"><strong>was $499 now $378 @ Amazon</strong></a><strong></strong></li><li><strong>Insta360 X5: </strong><a href="https://www.amazon.com/Insta360-Waterproof-Replaceable-Built-Stabilization/dp/B0DZCBYCNY" target="_blank" rel="nofollow"><strong>was $549 now $434 @ Amazon</strong></a><strong></strong></li></ul><h2 class="article-body__section" id="section-dji-deals"><span>DJI deals</span></h2><div class="product"><a data-dimension112="6997216e-09d8-4d30-840f-ac0eddd0a41d" data-action="Deal Block" data-label="DJI Osmo Pocket 4" data-dimension48="DJI Osmo Pocket 4" data-dimension25="$378" href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vmxWbj6M4Ne3zJqUM3GmJF" name="Osmo Pocket 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vmxWbj6M4Ne3zJqUM3GmJF.jpg" mos="" align="middle" fullscreen="" width="1440" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Unfortunately, the latest <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review" target="_blank" data-dimension112="6997216e-09d8-4d30-840f-ac0eddd0a41d" data-action="Deal Block" data-label="DJI Osmo Pocket 4" data-dimension48="DJI Osmo Pocket 4" data-dimension25="$378">DJI Osmo Pocket 4</a> isn't available in the U.S., but thankfully the <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3" target="_blank">Pocket 3</a> is still a fantastic camera. I've reviewed both, and the Pocket 3 is still a more than capable tool. Its key feature is the gimbal which keeps your footage super stable and smooth. It's an essential tool if you want to upgrade the look of your social or YouTube content.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD" target="_blank" rel="nofollow" data-dimension112="6997216e-09d8-4d30-840f-ac0eddd0a41d" data-action="Deal Block" data-label="DJI Osmo Pocket 4" data-dimension48="DJI Osmo Pocket 4" data-dimension25="$378">View Deal</a></p></div><div class="product"><a data-dimension112="3758cafd-a155-4897-8b99-dd1e562bd566" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$288" href="https://www.amazon.com/gp/aw/d/B0DS2DF5S5" 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:81.33%;"><img id="yuhEUh9SGzYYoDGQX6gPJT" name="DJI Osmo Action 5 Pro GRID" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yuhEUh9SGzYYoDGQX6gPJT.jpg" mos="" align="middle" fullscreen="" width="1500" height="1220" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review" target="_blank" data-dimension112="3758cafd-a155-4897-8b99-dd1e562bd566" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$288">DJI Osmo Action 5 Pro</a> held the top spot on my best action cameras list for a decent stretch of time (until it was succeeded by the newer <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-6-review" target="_blank">Osmo Action 6</a>). This camera is fantastic, and is still one of the best value-for-money propositions for action or motovlogging content. The video looks great, the stabilization is on point, there's internal storage, and it's as rugged as they come.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0DS2DF5S5" target="_blank" rel="nofollow" data-dimension112="3758cafd-a155-4897-8b99-dd1e562bd566" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$288">View Deal</a></p></div><div class="product"><a data-dimension112="63f34e30-7137-43b6-a983-e1012327a093" data-action="Deal Block" data-label="Osmo Action 4" data-dimension48="Osmo Action 4" data-dimension25="$179" href="https://www.amazon.com/DJI-Waterproof-Low-Light-Performance-Long-Lasting/dp/B0C783YNW7" 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="8RNoiAvEdbtYEJ6r9mu2EA" name="DJI Osmo Action 4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8RNoiAvEdbtYEJ6r9mu2EA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're after a budget powerhouse, the <a href="https://www.tomsguide.com/reviews/dji-osmo-action-4" target="_blank" data-dimension112="63f34e30-7137-43b6-a983-e1012327a093" data-action="Deal Block" data-label="Osmo Action 4" data-dimension48="Osmo Action 4" data-dimension25="$179">Osmo Action 4</a> is the camera for you. It's a couple of years old now, and DJI has made some serious progress in the later models, but this is still an excellent camera if you need something waterproof and rugged that'll output professional-looking 4K. And at this price, it's a no-brainer.<a class="view-deal button" href="https://www.amazon.com/DJI-Waterproof-Low-Light-Performance-Long-Lasting/dp/B0C783YNW7" target="_blank" rel="nofollow" data-dimension112="63f34e30-7137-43b6-a983-e1012327a093" data-action="Deal Block" data-label="Osmo Action 4" data-dimension48="Osmo Action 4" data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="8e737159-0b9f-4d1f-84cf-aaf828607e74" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$357.47" href="https://www.amazon.com/DJI-Standard-Imaging-Recording-Waterproof/dp/B0DTTZZ6Q3/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1090px;"><p class="vanilla-image-block" style="padding-top:137.61%;"><img id="yUXRL4qFis7QUzehxiNGTN" name="DJI Osmo 360" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yUXRL4qFis7QUzehxiNGTN.jpg" mos="" align="middle" fullscreen="" width="1090" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>DJI's first 360 camera didn't do quite enough to match its rivals, the Insta360 X5 and GoPro MAX2. However, the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review" target="_blank" data-dimension112="8e737159-0b9f-4d1f-84cf-aaf828607e74" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$357.47">DJI Osmo 360</a> is still a perfectly capable 8K 360-degree camera, and is the one to go for if you're already invested in the DJI ecosystem and want the extra flexibility of 360 recording. It uses the same batteries as other Osmo cameras and can sync wirelessly to DJI mics.<a class="view-deal button" href="https://www.amazon.com/DJI-Standard-Imaging-Recording-Waterproof/dp/B0DTTZZ6Q3/" target="_blank" rel="nofollow" data-dimension112="8e737159-0b9f-4d1f-84cf-aaf828607e74" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$357.47">View Deal</a></p></div><h2 class="article-body__section" id="section-gopro-deals"><span>GoPro deals</span></h2><div class="product"><a data-dimension112="0f9ebe9e-1df1-4dfd-9807-43fc17eaec16" data-action="Deal Block" data-label="MAX2" data-dimension48="MAX2" data-dimension25="$299" href="https://www.amazon.com/GoPro-MAX2-Traditional-Replaceable-Stabilization/dp/B0FNGK6JZP" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1159px;"><p class="vanilla-image-block" style="padding-top:109.84%;"><img id="CZJ2XozEEfGMiunpAjNVFk" name="GoPro MAX2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/CZJ2XozEEfGMiunpAjNVFk.jpg" mos="" align="middle" fullscreen="" width="1159" height="1273" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This is my favorite deal so far this Prime Day. The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-max2-review" target="_blank" data-dimension112="0f9ebe9e-1df1-4dfd-9807-43fc17eaec16" data-action="Deal Block" data-label="MAX2" data-dimension48="MAX2" data-dimension25="$299">MAX2</a> is an awesome 360 camera, and the closest rival to Insta360's X5. It loses out to the X5 on internal audio quality, but has it matched virtually everywhere else, including 8K video (where arguably, it's stronger). This $200 discount is frankly crazy. Unless you're invested in Insta360 or DJI systems already, snap this deal up now!<a class="view-deal button" href="https://www.amazon.com/GoPro-MAX2-Traditional-Replaceable-Stabilization/dp/B0FNGK6JZP" target="_blank" rel="nofollow" data-dimension112="0f9ebe9e-1df1-4dfd-9807-43fc17eaec16" data-action="Deal Block" data-label="MAX2" data-dimension48="MAX2" data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="65eabcd6-6738-4c63-83b0-58b051e0420c" data-action="Deal Block" data-label="There aren't many decent deals on GoPro gear yet, and this is the only other one I'd recommend. The tiny LIT Hero shoots 4K/60p, offers decent battery life and thermals and has a built-in light. For similar money, I would recommend the DJI Osmo Action 4 instead, unless you're already invested in other GoPro gear — in which case, this would be my recommendation for a cheap action cam." data-dimension48="There aren't many decent deals on GoPro gear yet, and this is the only other one I'd recommend. The tiny LIT Hero shoots 4K/60p, offers decent battery life and thermals and has a built-in light. For similar money, I would recommend the DJI Osmo Action 4 instead, unless you're already invested in other GoPro gear — in which case, this would be my recommendation for a cheap action cam." data-dimension25="$179" href="https://www.amazon.com/GoPro-LIT-Hero-Built-Stabilization/dp/B0FP5R9BDZ" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="jmQXkKy9zgwvpkYY52NRyn" name="GoPro LIT Hero deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/jmQXkKy9zgwvpkYY52NRyn.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>There aren't many decent deals on GoPro gear yet, and this is the only other one I'd recommend. The tiny LIT Hero shoots 4K/60p, offers decent battery life and thermals and has a built-in light. For similar money, I would recommend the DJI Osmo Action 4 instead, unless you're already invested in other GoPro gear — in which case, this would be my recommendation for a cheap action cam.<a class="view-deal button" href="https://www.amazon.com/GoPro-LIT-Hero-Built-Stabilization/dp/B0FP5R9BDZ" target="_blank" rel="nofollow" data-dimension112="65eabcd6-6738-4c63-83b0-58b051e0420c" data-action="Deal Block" data-label="There aren't many decent deals on GoPro gear yet, and this is the only other one I'd recommend. The tiny LIT Hero shoots 4K/60p, offers decent battery life and thermals and has a built-in light. For similar money, I would recommend the DJI Osmo Action 4 instead, unless you're already invested in other GoPro gear — in which case, this would be my recommendation for a cheap action cam." data-dimension48="There aren't many decent deals on GoPro gear yet, and this is the only other one I'd recommend. The tiny LIT Hero shoots 4K/60p, offers decent battery life and thermals and has a built-in light. For similar money, I would recommend the DJI Osmo Action 4 instead, unless you're already invested in other GoPro gear — in which case, this would be my recommendation for a cheap action cam." data-dimension25="$179">View Deal</a></p></div><h2 class="article-body__section" id="section-insta360-deals"><span>Insta360 deals</span></h2><div class="product"><a data-dimension112="dd1032aa-1386-49a2-a3dd-bc9a5a1e9279" data-action="Deal Block" data-label="X5" data-dimension48="X5" data-dimension25="$434.99" href="https://www.amazon.com/Insta360-Waterproof-Replaceable-Built-Stabilization/dp/B0DZCBYCNY" 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:111.40%;"><img id="yGDrsxDPAa6hgWeYP9bM5h" name="Insta360 X5" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yGDrsxDPAa6hgWeYP9bM5h.jpg" mos="" align="middle" fullscreen="" width="500" height="557" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Insta360 rarely offers huge discounts on its flagship products. However, the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x5-review" target="_blank" data-dimension112="dd1032aa-1386-49a2-a3dd-bc9a5a1e9279" data-action="Deal Block" data-label="X5" data-dimension48="X5" data-dimension25="$434.99">X5</a> is getting a little long in the tooth now (at least by Insta360 standards...), so despite <em>still</em> being the best 360 camera around, I'm not surprised it's getting a chunk off the price now. Listen, the GoPro MAX2 is cheaper right now, making it a better choice in value-for-money terms. But if you want the <em>very</em> best camera and have the extra cash, this deal is for you.<a class="view-deal button" href="https://www.amazon.com/Insta360-Waterproof-Replaceable-Built-Stabilization/dp/B0DZCBYCNY" target="_blank" rel="nofollow" data-dimension112="dd1032aa-1386-49a2-a3dd-bc9a5a1e9279" data-action="Deal Block" data-label="X5" data-dimension48="X5" data-dimension25="$434.99">View Deal</a></p></div><div class="product"><a data-dimension112="25600d4c-08ba-4f52-a223-630bec942f63" data-action="Deal Block" data-label="The Insta360 X4 Air is the light version of the original X4, packing 8K/30p 360 footage, strong internal audio and Insta360's usual 'straight to social' mentality. This is a decent deal, but you can grab the GoPro MAX2 for $25 less right now, and that shoots 8K in 60fps, giving you more flexibility with fast-paced action footage (where these cameras are supposed to be used)." data-dimension48="The Insta360 X4 Air is the light version of the original X4, packing 8K/30p 360 footage, strong internal audio and Insta360's usual 'straight to social' mentality. This is a decent deal, but you can grab the GoPro MAX2 for $25 less right now, and that shoots 8K in 60fps, giving you more flexibility with fast-paced action footage (where these cameras are supposed to be used)." data-dimension25="$324.99" href="https://www.amazon.com/Insta360-Starter-Bundle-Built-Stabilization/dp/B0FQNWDYMS" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1121px;"><p class="vanilla-image-block" style="padding-top:91.53%;"><img id="BPUBeUjqhrTY5s78xLuzHS" name="Insta360 X4 Air" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/BPUBeUjqhrTY5s78xLuzHS.jpg" mos="" align="middle" fullscreen="" width="1121" height="1026" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Insta360 X4 Air is the light version of the original X4, packing 8K/30p 360 footage, strong internal audio and Insta360's usual 'straight to social' mentality. This is a decent deal, but you can grab the GoPro MAX2 for $25 less right now, and that shoots 8K in 60fps, giving you more flexibility with fast-paced action footage (where these cameras are supposed to be used). <a class="view-deal button" href="https://www.amazon.com/Insta360-Starter-Bundle-Built-Stabilization/dp/B0FQNWDYMS" target="_blank" rel="nofollow" data-dimension112="25600d4c-08ba-4f52-a223-630bec942f63" data-action="Deal Block" data-label="The Insta360 X4 Air is the light version of the original X4, packing 8K/30p 360 footage, strong internal audio and Insta360's usual 'straight to social' mentality. This is a decent deal, but you can grab the GoPro MAX2 for $25 less right now, and that shoots 8K in 60fps, giving you more flexibility with fast-paced action footage (where these cameras are supposed to be used)." data-dimension48="The Insta360 X4 Air is the light version of the original X4, packing 8K/30p 360 footage, strong internal audio and Insta360's usual 'straight to social' mentality. This is a decent deal, but you can grab the GoPro MAX2 for $25 less right now, and that shoots 8K in 60fps, giving you more flexibility with fast-paced action footage (where these cameras are supposed to be used)." data-dimension25="$324.99">View Deal</a></p></div><div class="product"><a data-dimension112="e088da30-110e-441b-b665-4b4f3c6f527a" data-action="Deal Block" data-label="360 on a budget! If you're not fussed about 4K exports, the X3 is still a fairly capable 360 camera. If you're mainly shooting for social, its 5.7K 360 resolution should be more than enough for either 1080p or 2.7K exports." data-dimension48="360 on a budget! If you're not fussed about 4K exports, the X3 is still a fairly capable 360 camera. If you're mainly shooting for social, its 5.7K 360 resolution should be more than enough for either 1080p or 2.7K exports." data-dimension25="$229.99" href="https://www.amazon.com/Insta360-Single-Lens-Stabilization-Touchscreen-Wintersports/dp/B0B9H572LC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:859px;"><p class="vanilla-image-block" style="padding-top:145.17%;"><img id="Mm4ed6xKJUTATehFvdbfGJ" name="Insta360 X3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Mm4ed6xKJUTATehFvdbfGJ.jpg" mos="" align="middle" fullscreen="" width="859" height="1247" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>360 on a budget! If you're not fussed about 4K exports, the X3 is still a fairly capable 360 camera. If you're mainly shooting for social, its 5.7K 360 resolution should be more than enough for either 1080p or 2.7K exports. <a class="view-deal button" href="https://www.amazon.com/Insta360-Single-Lens-Stabilization-Touchscreen-Wintersports/dp/B0B9H572LC" target="_blank" rel="nofollow" data-dimension112="e088da30-110e-441b-b665-4b4f3c6f527a" data-action="Deal Block" data-label="360 on a budget! If you're not fussed about 4K exports, the X3 is still a fairly capable 360 camera. If you're mainly shooting for social, its 5.7K 360 resolution should be more than enough for either 1080p or 2.7K exports." data-dimension48="360 on a budget! If you're not fussed about 4K exports, the X3 is still a fairly capable 360 camera. If you're mainly shooting for social, its 5.7K 360 resolution should be more than enough for either 1080p or 2.7K exports." data-dimension25="$229.99">View Deal</a></p></div><div class="product"><a data-dimension112="7bf5c1fa-01bb-404a-b772-c43209da3822" data-action="Deal Block" data-label="Ace Pro 2" data-dimension48="Ace Pro 2" data-dimension25="$309.99" href="https://www.amazon.com/Insta360-Dual-Battery-Bundle-Co-Engineered/dp/B0FLQ82JZK" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:944px;"><p class="vanilla-image-block" style="padding-top:99.89%;"><img id="4dhhwV4RqKuuSRRijbFpeD" name="Insta360 Ace Pro 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4dhhwV4RqKuuSRRijbFpeD.jpg" mos="" align="middle" fullscreen="" width="944" height="943" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Ace Pro line has always been the bridesmaid and never the bride, losing out to the DJI and GoPro flagships each iteration. Still, the Ace Pro 2 is a formidable camera with a trick up its sleeve: 8K. This makes the Ace Pro 2 great if you need extra resolution for cropping and reframing in post, while maintaining high res exports. The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-ace-pro-2-review" target="_blank" data-dimension112="7bf5c1fa-01bb-404a-b772-c43209da3822" data-action="Deal Block" data-label="Ace Pro 2" data-dimension48="Ace Pro 2" data-dimension25="$309.99">Ace Pro 2</a> hasn't dropped much in price over its current lifespan, until now! This is the lowest price ever.<a class="view-deal button" href="https://www.amazon.com/Insta360-Dual-Battery-Bundle-Co-Engineered/dp/B0FLQ82JZK" target="_blank" rel="nofollow" data-dimension112="7bf5c1fa-01bb-404a-b772-c43209da3822" data-action="Deal Block" data-label="Ace Pro 2" data-dimension48="Ace Pro 2" data-dimension25="$309.99">View Deal</a></p></div><h2 class="article-body__section" id="section-u-k-deals"><span>U.K. deals</span></h2><div class="product"><a data-dimension112="2b3d4886-ead8-4dce-ba0a-7b2213fdac3b" data-action="Deal Block" data-label="In the U.K., where DJI isn't subjected to the same regulations as the U.S., the Osmo Pocket 3 is much cheaper. The Pocket 4 is currently not on sale, so to any vloggers looking for a quick and effective upgrade to shooting on their smartphone: this is the deal for you!" data-dimension48="In the U.K., where DJI isn't subjected to the same regulations as the U.S., the Osmo Pocket 3 is much cheaper. The Pocket 4 is currently not on sale, so to any vloggers looking for a quick and effective upgrade to shooting on their smartphone: this is the deal for you!" data-dimension25="£277" href="https://www.amazon.co.uk/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vmxWbj6M4Ne3zJqUM3GmJF" name="Osmo Pocket 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vmxWbj6M4Ne3zJqUM3GmJF.jpg" mos="" align="middle" fullscreen="" width="1440" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In the U.K., where DJI isn't subjected to the same regulations as the U.S., the Osmo Pocket 3 is much cheaper. The Pocket 4 is currently not on sale, so to any vloggers looking for a quick and effective upgrade to shooting on their smartphone: this is the deal for you!<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD/" target="_blank" rel="nofollow" data-dimension112="2b3d4886-ead8-4dce-ba0a-7b2213fdac3b" data-action="Deal Block" data-label="In the U.K., where DJI isn't subjected to the same regulations as the U.S., the Osmo Pocket 3 is much cheaper. The Pocket 4 is currently not on sale, so to any vloggers looking for a quick and effective upgrade to shooting on their smartphone: this is the deal for you!" data-dimension48="In the U.K., where DJI isn't subjected to the same regulations as the U.S., the Osmo Pocket 3 is much cheaper. The Pocket 4 is currently not on sale, so to any vloggers looking for a quick and effective upgrade to shooting on their smartphone: this is the deal for you!" data-dimension25="£277">View Deal</a></p></div><div class="product"><a data-dimension112="f6cf2a2c-e32f-4d7e-a949-3703ac249262" data-action="Deal Block" data-label="The Osmo Action 5 Pro is now extremely keenly priced in the U.K., at just £233. This puts it into the budget action camera realm, which is frankly astounding given this is only last year's flagship model, and is a capable professional tool!" data-dimension48="The Osmo Action 5 Pro is now extremely keenly priced in the U.K., at just £233. This puts it into the budget action camera realm, which is frankly astounding given this is only last year's flagship model, and is a capable professional tool!" data-dimension25="£233" href="https://www.amazon.co.uk/DJI-Standard-Waterproof-Stabilization-Touchscreens/dp/B0D1YH4B2R" 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:81.33%;"><img id="yuhEUh9SGzYYoDGQX6gPJT" name="DJI Osmo Action 5 Pro GRID" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yuhEUh9SGzYYoDGQX6gPJT.jpg" mos="" align="middle" fullscreen="" width="1500" height="1220" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Osmo Action 5 Pro is now extremely keenly priced in the U.K., at just £233. This puts it into the budget action camera realm, which is frankly astounding given this is only last year's flagship model, and is a capable professional tool!<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Standard-Waterproof-Stabilization-Touchscreens/dp/B0D1YH4B2R" target="_blank" rel="nofollow" data-dimension112="f6cf2a2c-e32f-4d7e-a949-3703ac249262" data-action="Deal Block" data-label="The Osmo Action 5 Pro is now extremely keenly priced in the U.K., at just £233. This puts it into the budget action camera realm, which is frankly astounding given this is only last year's flagship model, and is a capable professional tool!" data-dimension48="The Osmo Action 5 Pro is now extremely keenly priced in the U.K., at just £233. This puts it into the budget action camera realm, which is frankly astounding given this is only last year's flagship model, and is a capable professional tool!" data-dimension25="£233">View Deal</a></p></div><div class="product"><a data-dimension112="e97e8055-86f3-4a5a-a3cb-add013174b7a" data-action="Deal Block" data-label="In both the U.S. and U.K. markets, the Osmo Action 4 is a no brainer if you're on a budget. This really is as cheap as respectable action cameras get. So, while you might find a GoPro Hero, an older used camera, or a disreputable brand cheaper, there really is no reason to buy any of them when the OA4 is just £159. Crazy cheap." data-dimension48="In both the U.S. and U.K. markets, the Osmo Action 4 is a no brainer if you're on a budget. This really is as cheap as respectable action cameras get. So, while you might find a GoPro Hero, an older used camera, or a disreputable brand cheaper, there really is no reason to buy any of them when the OA4 is just £159. Crazy cheap." data-dimension25="£159" href="https://www.amazon.co.uk/DJI-Essential-Low-Light-Underwater-Performance/dp/B0DS2B3P2B" 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="8RNoiAvEdbtYEJ6r9mu2EA" name="DJI Osmo Action 4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8RNoiAvEdbtYEJ6r9mu2EA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In both the U.S. and U.K. markets, the Osmo Action 4 is a no brainer if you're on a budget. This really is as cheap as respectable action cameras get. So, while you might find a GoPro Hero, an older used camera, or a disreputable brand cheaper, there really is no reason to buy any of them when the OA4 is just £159. Crazy cheap.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Essential-Low-Light-Underwater-Performance/dp/B0DS2B3P2B" target="_blank" rel="nofollow" data-dimension112="e97e8055-86f3-4a5a-a3cb-add013174b7a" data-action="Deal Block" data-label="In both the U.S. and U.K. markets, the Osmo Action 4 is a no brainer if you're on a budget. This really is as cheap as respectable action cameras get. So, while you might find a GoPro Hero, an older used camera, or a disreputable brand cheaper, there really is no reason to buy any of them when the OA4 is just £159. Crazy cheap." data-dimension48="In both the U.S. and U.K. markets, the Osmo Action 4 is a no brainer if you're on a budget. This really is as cheap as respectable action cameras get. So, while you might find a GoPro Hero, an older used camera, or a disreputable brand cheaper, there really is no reason to buy any of them when the OA4 is just £159. Crazy cheap." data-dimension25="£159">View Deal</a></p></div><div class="product"><a data-dimension112="9f68df8f-7d80-44b3-b61e-392877adc75d" data-action="Deal Block" data-label="DJI Osmo Nano" data-dimension48="DJI Osmo Nano" data-dimension25="£223.25" href="https://www.amazon.co.uk/DJI-Osmo-Nano-Standard-Combo/dp/B0FBFZM45S" 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="A7J8t2TnCNTfKnsaCkbtvR" name="dji-osmo-nano-standard-combo-128gb--smal-f9aa7961-ac4a-4fb4-9812-a50344a4bdd2.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/A7J8t2TnCNTfKnsaCkbtvR.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-nano-review" target="_blank" data-dimension112="9f68df8f-7d80-44b3-b61e-392877adc75d" data-action="Deal Block" data-label="DJI Osmo Nano" data-dimension48="DJI Osmo Nano" data-dimension25="£223.25">DJI Osmo Nano</a> is DJI's answer to the Insta360 Go and GoPro Hero lines of tiny action cams. And it's great! It features a removable screen which you can use as a remote and monitor. Fun fact: I shot my own wedding reception with one of these strapped to my head. Check out my review linked above to see some of that footage.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Osmo-Nano-Standard-Combo/dp/B0FBFZM45S" target="_blank" rel="nofollow" data-dimension112="9f68df8f-7d80-44b3-b61e-392877adc75d" data-action="Deal Block" data-label="DJI Osmo Nano" data-dimension48="DJI Osmo Nano" data-dimension25="£223.25">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-deals"><span>We're tracking all the best Prime Day deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Cameras+%26+Photography&view_mode=savings_squad&widget_title=Top+Prime+Day+camera+%26+photography+deals&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>
                                <item>
                                                            <title><![CDATA[ I review drones for a living and these are my 9 favorite affordable options for summer flying from DJI, Potensic and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/amazon-prime-day-2026-drones-deals</link>
                                                                            <description>
                            <![CDATA[ I fly drones for a living so if you want to take up aerial photography this summer, I've got you covered. These are my favorite Prime Day drone deals this week. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mMjnYGBtGP2RjWjD5jcKz8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vTY7zuepvjXbP8nKHZBuHm-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Jun 2026 12:50:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/vTY7zuepvjXbP8nKHZBuHm-1280-80.jpg">
                                                            <media:credit><![CDATA[DJI / Potensic / HoverAir / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of drones]]></media:description>                                                            <media:text><![CDATA[A selection of drones]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of drones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vTY7zuepvjXbP8nKHZBuHm-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This year's <a href="https://www.tomsguide.com/live/news/prime-day-2026-handpicked-editor-recommended-deals-live">Amazon Prime Day deals</a> are in full swing and that can only mean one thing: my favorite quadcopters have received massive price cuts so now's the time to save big on the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones.</a> Whether you're a veteran pilot or a newbie, there are plenty of discounts to be enjoyed by everyone — but there are so many deals to choose from, where do you even start?</p><p>I've got you so don't worry. I review drones for a living so I'm here to cut through the noise and bring you only the crème de la crème of deals. The best discount you can grab today is on the <a href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B0BL3R3L45/" target="_blank" rel="nofollow">DJI Mini 3 Fly More Combo which is a whopping 38% off</a>, so it's available for just $449 — and it includes a controller, carry bag and extra batteries. Also, our favorite budget drone is even cheaper today, so you can get the <a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow">DJI Neo for as little as $139</a>!</p><p>Of course, it's not just DJI's quadcopters that are discounted. The deal I'm most enticed by is on the <a href="https://www.amazon.com/Antigravity-Infinity-Micro-OLED-Goggles-Assistant/dp/B0H38VHZFR/" target="_blank" rel="nofollow">Antigravity A1 Infinity Bundle which is down to its lowest-ever price of $1,599</a>. I know that still sounds like a lot but you're saving over $400 on one of the best 360° 8K drones you can buy today.</p><p>And there's plenty more where that came from. Here are the 9 best Prime Day drone deals I've found (so far).</p><h2 id="meet-your-drones-deals-expert">Meet your drones deals expert</h2><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong></strong><a href="https://www.amazon.com/primeday" target="_blank" rel="nofollow"><strong>Shop all Amazon Prime Day deals now</strong></a><strong></strong></li><li><strong>DJI Mini 3 Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B0BL3R3L45/" target="_blank" rel="nofollow"><strong>was $719 now $449</strong></a><strong></strong></li><li><strong>DJI Mini 4K Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Stabilization-Transmission-Batteries-QuickShots/dp/B0F4WZ3Q2J/" target="_blank" rel="nofollow"><strong>was $389 now $255</strong></a><strong></strong></li><li><strong>DJI Neo: </strong><a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow"><strong>was $199 now $139</strong></a><strong></strong></li><li><strong>DJI Flip (with two batteries): </strong><a href="https://www.amazon.com/DJI-Battery-Controller-Intelligent-Batteries/dp/B0FR4HJQFR/" target="_blank" rel="nofollow"><strong>was $389 now $309</strong></a><strong></strong></li><li><strong>Antigravity A1 Infinity Bundle: </strong><a href="https://www.amazon.com/Antigravity-Infinity-Micro-OLED-Goggles-Assistant/dp/B0H38VHZFR/" target="_blank" rel="nofollow"><strong>was $1,999 now $1,599</strong></a><strong></strong></li><li><strong>Potensic Atom 2 Fly More Combo: </strong><a href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow"><strong>was $479 now $324</strong></a><strong></strong></li><li><strong>Potensic Atom SE Expansion Kit: </strong><a href="https://www.amazon.com/gp/aw/d/B0BFWS4N4T/" target="_blank" rel="nofollow"><strong>was $229 now $195</strong></a><strong></strong></li><li><strong>HoverAir X1 Combo Plus: </strong><a href="https://www.amazon.com/HOVERAir-Self-Flying-Foldable-Intelligent-Hands-Free/dp/B0CQJTHM5B/" target="_blank" rel="nofollow"><strong>was $339 now $271</strong></a></li><li><strong>HoverAir X1 ProMax: </strong><a href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTHLVR3/" target="_blank" rel="nofollow"><strong>was $699 now $594</strong></a></li></ul><h2 class="article-body__section" id="section-best-prime-day-dji-drone-deals"><span>Best Prime Day DJI drone deals</span></h2><div class="product"><a data-dimension112="c99a048a-7dca-4e9b-8000-efb053c71ad4" data-action="Deal Block" data-label="DJI Mini 3" data-dimension48="DJI Mini 3" data-dimension25="$449" href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B0BL3R3L45/" 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:76.40%;"><img id="dv4MemdBp94uLw7A4wUJLj" name="DJI-Mini-3-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dv4MemdBp94uLw7A4wUJLj.jpg" mos="" align="middle" fullscreen="" width="1500" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Though the <a href="https://www.tomsguide.com/reviews/dji-mini-3" data-dimension112="c99a048a-7dca-4e9b-8000-efb053c71ad4" data-action="Deal Block" data-label="DJI Mini 3" data-dimension48="DJI Mini 3" data-dimension25="$449">DJI Mini 3</a> is a couple generations old now, it's still a competent quadcopter. It packs a 1/1.3-inch CMOS sensor that's capable of capturing stunning, smooth 4K/30fps horizontal and vertical video as well as 12MP stills. 38 minutes of flight time packed into a compact body make it one of the best drones for beginners and those who love to travel.<a class="view-deal button" href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B0BL3R3L45/" target="_blank" rel="nofollow" data-dimension112="c99a048a-7dca-4e9b-8000-efb053c71ad4" data-action="Deal Block" data-label="DJI Mini 3" data-dimension48="DJI Mini 3" data-dimension25="$449">View Deal</a></p></div><div class="product"><a data-dimension112="e5a9a14d-752b-40f2-8088-ab018e7bdf75" data-action="Deal Block" data-label="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension48="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension25="$255" href="https://www.amazon.com/DJI-Stabilization-Transmission-Batteries-QuickShots/dp/B0F4WZ3Q2J/" 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:92.20%;"><img id="PgvNvPxsvHpkPD86QX6xFj" name="DJI-Mini-4K-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PgvNvPxsvHpkPD86QX6xFj.jpg" mos="" align="middle" fullscreen="" width="1500" height="1383" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-Transmission-Batteries-QuickShots/dp/B0F4WZ3Q2J/" target="_blank" rel="nofollow" data-dimension112="e5a9a14d-752b-40f2-8088-ab018e7bdf75" data-action="Deal Block" data-label="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension48="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension25="$255">View Deal</a></p></div><div class="product"><a data-dimension112="9adfbf4e-1483-4b81-9e99-27081197f5b9" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$139" href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" 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="yQ2D9952vwuZALYFFAiFF6" name="Neo-dealbox" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yQ2D9952vwuZALYFFAiFF6.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Even though it has now been succeeded by the DJI Neo 2, the Neo is still a beautiful little drone. In my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review" data-dimension112="9adfbf4e-1483-4b81-9e99-27081197f5b9" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$139">DJI Neo review,</a> I praised this drone for its lightweight, compact and minimalistic design. It can shoot 4K footage at 30fps, take detailed stills, and remain stable in tricky conditions. Easy to control with the RC-N3 controller or the DJI Fly app on a smartphone, the Neo makes drone photography more accessible thanks to its low price point.<a class="view-deal button" href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow" data-dimension112="9adfbf4e-1483-4b81-9e99-27081197f5b9" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$139">View Deal</a></p></div><div class="product"><a data-dimension112="e1697176-30c1-4550-b19d-ba597da548a8" data-action="Deal Block" data-label="DJI Flip review" data-dimension48="DJI Flip review" data-dimension25="$309" href="https://www.amazon.com/DJI-Battery-Controller-Intelligent-Batteries/dp/B0FR4HJQFR/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:70.20%;"><img id="wLTt4oR293UT4kynWhFF3A" name="DJI Flip deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/wLTt4oR293UT4kynWhFF3A.jpg" mos="" align="middle" fullscreen="" width="1500" height="1053" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review" data-dimension112="e1697176-30c1-4550-b19d-ba597da548a8" data-action="Deal Block" data-label="DJI Flip review" data-dimension48="DJI Flip review" data-dimension25="$309">DJI Flip review</a>, I noted that this drone was perfect for beginners or those looking to upgrade from older DJI models. The Flip captures detailed 48MP stills in all lighting conditions, and records gorgeous 4K/60fps footage. It’s great for content creators as it features many shooting modes, plus it’s built really well and sports a slick design — a little like a droid from Star Wars! The Flip is, in my opinion, the best drone for beginners.<a class="view-deal button" href="https://www.amazon.com/DJI-Battery-Controller-Intelligent-Batteries/dp/B0FR4HJQFR/" target="_blank" rel="nofollow" data-dimension112="e1697176-30c1-4550-b19d-ba597da548a8" data-action="Deal Block" data-label="DJI Flip review" data-dimension48="DJI Flip review" data-dimension25="$309">View Deal</a></p></div><h2 class="article-body__section" id="section-best-prime-day-antigravity-drone-deals"><span>Best Prime Day Antigravity drone deals</span></h2><div class="product"><a data-dimension112="cf859c35-fefa-427c-b021-4181e59e7ed5" data-action="Deal Block" data-label="For the first time, the Antigravity A1 Infinity Bundle is down to its lowest-ever price. As a 360° drone, the A1 lets you capture every angle possible. Footage is shot in 8K/30fps, enabling you to maintain 4K in 16x9 when reframing in post — and this footage is packed with detail. 55MP stills look great too. Flying the drone is easy (and immersive) with the Vision goggles and Grip controller." data-dimension48="For the first time, the Antigravity A1 Infinity Bundle is down to its lowest-ever price. As a 360° drone, the A1 lets you capture every angle possible. Footage is shot in 8K/30fps, enabling you to maintain 4K in 16x9 when reframing in post — and this footage is packed with detail. 55MP stills look great too. Flying the drone is easy (and immersive) with the Vision goggles and Grip controller." data-dimension25="$1599" href="https://www.amazon.com/Antigravity-Infinity-Micro-OLED-Goggles-Assistant/dp/B0H38VHZFR/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:884px;"><p class="vanilla-image-block" style="padding-top:69.12%;"><img id="bj8knFFm785m6wpHyMmgQT" name="Antigravity A1 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bj8knFFm785m6wpHyMmgQT.jpg" mos="" align="middle" fullscreen="" width="884" height="611" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For the first time, the Antigravity A1 Infinity Bundle is down to its lowest-ever price. As a 360° drone, the A1 lets you capture every angle possible. Footage is shot in 8K/30fps, enabling you to maintain 4K in 16x9 when reframing in post — and this footage is packed with detail. 55MP stills look great too. Flying the drone is easy (and immersive) with the Vision goggles and Grip controller.<a class="view-deal button" href="https://www.amazon.com/Antigravity-Infinity-Micro-OLED-Goggles-Assistant/dp/B0H38VHZFR/" target="_blank" rel="nofollow" data-dimension112="cf859c35-fefa-427c-b021-4181e59e7ed5" data-action="Deal Block" data-label="For the first time, the Antigravity A1 Infinity Bundle is down to its lowest-ever price. As a 360° drone, the A1 lets you capture every angle possible. Footage is shot in 8K/30fps, enabling you to maintain 4K in 16x9 when reframing in post — and this footage is packed with detail. 55MP stills look great too. Flying the drone is easy (and immersive) with the Vision goggles and Grip controller." data-dimension48="For the first time, the Antigravity A1 Infinity Bundle is down to its lowest-ever price. As a 360° drone, the A1 lets you capture every angle possible. Footage is shot in 8K/30fps, enabling you to maintain 4K in 16x9 when reframing in post — and this footage is packed with detail. 55MP stills look great too. Flying the drone is easy (and immersive) with the Vision goggles and Grip controller." data-dimension25="$1599">View Deal</a></p></div><h2 class="article-body__section" id="section-best-prime-day-potensic-drone-deals"><span>Best Prime Day Potensic drone deals</span></h2><div class="product"><a data-dimension112="726c4705-540d-43b2-8603-21c3bfb7abfb" data-action="Deal Block" data-label="my review" data-dimension48="my review" data-dimension25="$324" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" 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:78.13%;"><img id="QEqNG4iNnxL2KBjVQKhum8" name="Potensic-Atom-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QEqNG4iNnxL2KBjVQKhum8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1172" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Potensic Atom 2 is <em>even better </em>than its predecessor, as it can capture 48MP stills. In <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review" data-dimension112="726c4705-540d-43b2-8603-21c3bfb7abfb" data-action="Deal Block" data-label="my review" data-dimension48="my review" data-dimension25="$324">my review</a>, I noted that it records stable, smooth 4K/30fps video and features advanced, accurate AI subject tracking, along with a new, easy-to-use controller and app. It’s also lightweight yet sturdy. This deal includes extra batteries, a controller, and a carry bag.<a class="view-deal button" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow" data-dimension112="726c4705-540d-43b2-8603-21c3bfb7abfb" data-action="Deal Block" data-label="my review" data-dimension48="my review" data-dimension25="$324">View Deal</a></p></div><div class="product"><a data-dimension112="0702164b-46e0-4ba1-ba92-1ab6736bda13" data-action="Deal Block" data-label="The Potensic Atom SE Expansion Kit includes the drone, two batteries, a controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. The Atom SE is a great starting point for new drone pilots." data-dimension48="The Potensic Atom SE Expansion Kit includes the drone, two batteries, a controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. The Atom SE is a great starting point for new drone pilots." data-dimension25="$195" href="https://www.amazon.com/gp/aw/d/B0BFWS4N4T/" 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:85.07%;"><img id="MGhcidVaYSkc7Lt5KR98h4" name="Potensic Atom SE deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MGhcidVaYSkc7Lt5KR98h4.jpg" mos="" align="middle" fullscreen="" width="1500" height="1276" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Potensic Atom SE Expansion Kit includes the drone, two batteries, a controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. The Atom SE is a great starting point for new drone pilots.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0BFWS4N4T/" target="_blank" rel="nofollow" data-dimension112="0702164b-46e0-4ba1-ba92-1ab6736bda13" data-action="Deal Block" data-label="The Potensic Atom SE Expansion Kit includes the drone, two batteries, a controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. The Atom SE is a great starting point for new drone pilots." data-dimension48="The Potensic Atom SE Expansion Kit includes the drone, two batteries, a controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. The Atom SE is a great starting point for new drone pilots." data-dimension25="$195">View Deal</a></p></div><h2 class="article-body__section" id="section-best-prime-day-hoverair-drone-deals"><span>Best Prime Day HoverAir drone deals</span></h2><div class="product"><a data-dimension112="889736dd-5f6d-4b22-9bfb-76e95e739f3a" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$271" href="https://www.amazon.com/HOVERAir-Self-Flying-Foldable-Intelligent-Hands-Free/dp/B0CQJTHM5B/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1441px;"><p class="vanilla-image-block" style="padding-top:92.23%;"><img id="DNC8WM5nWsq28ydhTF8jj" name="HoverAir-X1-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/DNC8WM5nWsq28ydhTF8jj.jpg" mos="" align="middle" fullscreen="" width="1441" height="1329" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Unlike most other drones, you don't need a controller or a smartphone to fly the HoverAir X1, which is why it's a great selfie drone. Simply press the buttons on its body and it will record short-form videos and save them internally. My colleague <a href="https://www.tomsguide.com/features/sorry-dji-this-pocketable-folding-drone-is-the-most-fun-ive-had-flying-in-a-long-time" data-dimension112="889736dd-5f6d-4b22-9bfb-76e95e739f3a" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$271">enjoyed using it a lot</a> and appreciated its surprisingly good obstacle avoidance and subject tracking features such as follow, rocket, and more.<a class="view-deal button" href="https://www.amazon.com/HOVERAir-Self-Flying-Foldable-Intelligent-Hands-Free/dp/B0CQJTHM5B/" target="_blank" rel="nofollow" data-dimension112="889736dd-5f6d-4b22-9bfb-76e95e739f3a" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$271">View Deal</a></p></div><div class="product"><a data-dimension112="2647749e-1c2e-4600-9daf-ab817d3a2d68" data-action="Deal Block" data-label="HoverAir X1 ProMax" data-dimension48="HoverAir X1 ProMax" data-dimension25="$594" href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTHLVR3/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1409px;"><p class="vanilla-image-block" style="padding-top:95.81%;"><img id="MSdGJ6i6pkFJP3J5ns6pdT" name="HoverAir X1 ProMax deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/MSdGJ6i6pkFJP3J5ns6pdT.jpg" mos="" align="middle" fullscreen="" width="1409" height="1350" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're looking for a step up from the aforementioned HoverAir X1, the <a href="https://www.tomsguide.com/cameras-photography/drones/hoverair-x1-pro-promax-review" data-dimension112="2647749e-1c2e-4600-9daf-ab817d3a2d68" data-action="Deal Block" data-label="HoverAir X1 ProMax" data-dimension48="HoverAir X1 ProMax" data-dimension25="$594">HoverAir X1 ProMax</a> might be right for you. It is the premium model in the X1 lineup and it's capable of capturing 8K/30fps and 4K/60fps video and saving footage to its 64GB internal storage.<a class="view-deal button" href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTHLVR3/" target="_blank" rel="nofollow" data-dimension112="2647749e-1c2e-4600-9daf-ab817d3a2d68" data-action="Deal Block" data-label="HoverAir X1 ProMax" data-dimension48="HoverAir X1 ProMax" data-dimension25="$594">View Deal</a></p></div><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-drone-deals"><span>We're tracking all the best Prime Day drone deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Drones&min_discount_ratio=0.95&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left,    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right {      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right { right: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-left { left: 0; }    .tg-df-grid-wrapper .tg-df-carousel-scroll-right { right: 0; }        .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-left:hover,    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button { 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 (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let rightChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             let leftChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-left');             if (this.getViewMode() === 'carousel') {                 // The observer set up in setupScrollListeners handles visibility.                 if (rightChevron) rightChevron.style.display = 'flex';                 if (leftChevron) leftChevron.style.display = 'none'; // reset correctly             } else {                 if (rightChevron) rightChevron.style.display = 'none';                 if (leftChevron) leftChevron.style.display = 'none';             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ No, you can't buy the DJI Osmo Pocket 4 in the U.S. — but you can get the Osmo Pocket 3 for $90 off right now ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-3-amazon-prime-day-2026</link>
                                                                            <description>
                            <![CDATA[ The DJI Osmo Pocket 4 is a fantastic gimbal camera which is why it's a shame that it isn't available in the U.S. But its predecessor is available and it's $90 off. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zYVMbj3QzS8XduUR9JeUam</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/29MaZDuoprcuAi8fcFdnd-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 22 Jun 2026 17:34:15 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres.&lt;/p&gt;&lt;p&gt;A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/29MaZDuoprcuAi8fcFdnd-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Osmo Pocket 3]]></media:description>                                                            <media:text><![CDATA[A DJI Osmo Pocket 3]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Osmo Pocket 3]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/29MaZDuoprcuAi8fcFdnd-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I love going to concerts and music festivals, and I've always been a little sad that many venues don't allow cameras with changeable lenses — which is understandable, of course. Thankfully, there are ways around it, and you don't always have to rely on your smartphone for getting beautiful footage of your favorite artists.</p><p>The solution? Why, a gimbal camera, of course! We test many of these nifty devices, and unfortunately, the best we've tested so far isn't available in the U.S. The <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review">DJI Osmo Pocket 4</a> is a 5-star gimbal camera that doesn't give you much to complain about. Well, except for the fact that it can't be bought in the States.</p><p>You know what can be bought in the U.S., though? Its predecessor: the 4.5-star <a href="https://www.amazon.com/DJI-Vlogging-Stabilization-Tracking-Photography/dp/B0CG19FGQ5/" target="_blank" rel="nofollow">DJI Osmo Pocket 3 which is currently $90 off at Amazon</a>. The <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3">Osmo Pocket 3</a>, even three years on, is one of the <a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">best cameras</a> you can buy, and it's perfect for travel, vlogging, concerts, festivals, even professional videography.</p><div class="product"><a data-dimension112="98b0522b-1132-4e70-99f4-2b1871e8ceb7" data-action="Deal Block" data-label="The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage." data-dimension48="The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage." data-dimension25="$539" href="https://www.amazon.com/DJI-Vlogging-Stabilization-Tracking-Photography/dp/B0CG19FGQ5/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:560px;"><p class="vanilla-image-block" style="padding-top:103.21%;"><img id="k2TTAhmN9A6tZiDzvApqCP" name="Summer-festival-gadgets-deal-box-3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/k2TTAhmN9A6tZiDzvApqCP.png" mos="" align="middle" fullscreen="" width="560" height="578" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage.<a class="view-deal button" href="https://www.amazon.com/DJI-Vlogging-Stabilization-Tracking-Photography/dp/B0CG19FGQ5/" target="_blank" rel="nofollow" data-dimension112="98b0522b-1132-4e70-99f4-2b1871e8ceb7" data-action="Deal Block" data-label="The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage." data-dimension48="The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage." data-dimension25="$539">View Deal</a></p></div><p>There's a lot to love about the Osmo Pocket 3. It features a 1-inch CMOS sensor that's great for capturing plenty of detail, regardless of the lighting conditions. That's right: its low-light performance is formidable. It's an all-in-one camera which is equipped with a built-in three-axis gimbal that enables you to capture super smooth video effortlessly.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/d6cpvUXrrxs" allowfullscreen></iframe></div></div><p>The Osmo Pocket 3 is fitted with a 2-inch touchscreen which lets you quickly change resolution and frame rate, as well as focus modes and other shooting settings. It also pivots 90° so you can switch between horizontal and vertical shooting as needed. One of the Osmo Pocket 3's biggest selling points is its design: it measures and weighs barely anything, so you can slip it into your pocket, akin to a phone, and be on your way.</p><p>Autofocus performance is outstanding, as the Osmo Pocket 3 effectively and accurately tracks humans as well as inanimate objects. Stabilization is impeccable thanks to the three-axis gimbal, which I briefly mentioned earlier. 4K/60fps video is gorgeous, with accurate color reproduction. And in our testing, the Osmo Pocket 3 lasted nearly two hours between charges.</p><p>This <a href="https://www.amazon.com/DJI-Vlogging-Stabilization-Tracking-Photography/dp/B0CG19FGQ5/" target="_blank" rel="nofollow">early Amazon Prime Day deal cuts the price of the Osmo Pocket 3 Creator Combo by 14%</a>, so you can save $90 on it. The Creator Combo includes a wide-angle lens, DJI Mic 2 transmitter and receiver, a mini tripod, and a carry case for the camera and all its accessories. Seriously, it's the best camera to get in lieu of the Osmo Pocket 4.</p><h3 class="article-body__section" id="section-we-re-tracking-all-the-best-prime-day-home-appliance-deals"><span>We're tracking all the best Prime Day home appliance deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Home+Appliances&price=50_&min_discount_ratio=0.95&offer_type=all&rows=4&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&show_countdown=true&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters {      display: flex;      gap: 12px;      justify-content: center;      flex-wrap: wrap;    }    .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);      display: -webkit-box;      -webkit-line-clamp: 2;      -webkit-box-orient: vertical;      overflow: hidden;    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    .tg-df-container .tg-df-card-cta.tg-df-cta-savings-squad {      background-color: #3c8d0d;    }    .tg-df-card:hover .tg-df-card-cta.tg-df-cta-savings-squad,    .tg-df-card-cta.tg-df-cta-savings-squad:hover {      background-color: #2b6509;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 0;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 0 16px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }            .tg-df-filters {        width: calc(100% + 32px);        margin: 0 -16px;        padding: 0 16px 4px 16px;        display: flex;        justify-content: flex-start;        gap: 8px;        flex-wrap: nowrap;        overflow-x: auto;        -webkit-overflow-scrolling: touch;        scrollbar-width: none;      }      .tg-df-filters::after {        content: "";        display: block;        flex: 0 0 8px;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }            .tg-df-sort-wrapper {        flex: 0 0 max(42%, 130px);        min-width: 0;      }      .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;        -webkit-line-clamp: 3;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        -webkit-line-clamp: 3;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 16px;      text-align: center;      width: 100%;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: #f8fafc;      border-color: #cbd5e1;    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right {      right: 0;      background-color: rgba(255, 255, 255, 0.4);      border: none;      box-shadow: none;      backdrop-filter: blur(4px);      -webkit-backdrop-filter: blur(4px);    }    .tg-df-carousel-roundels-wrapper .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);      border: none;    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-carousel-roundels::after {      content: "";      flex: 0 0 32px;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;      transition: font-weight 0.2s;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-label {      font-weight: 700;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;      display: inline-flex;      align-items: center;      justify-content: center;      min-height: 36px;      box-sizing: border-box;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::after {      content: "";      flex: 0 0 32px;    }    .tg-df-grid-wrapper {      position: relative;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card {      flex: 0 0 auto;      width: 100px;      border-radius: 15px;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      border: 2px solid #1e293b;      background: white;      color: #1e293b;      display: flex;      flex-direction: column;      justify-content: center;      align-items: center;      font-weight: 600;      font-size: 14px;      cursor: pointer;      padding: 16px;      text-align: center;      transition: all 0.2s;    }    .tg-df-grid.carousel-compact .tg-df-load-more-card:hover {      background: #1e293b;      color: white;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      -webkit-line-clamp: 2;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {      -webkit-line-clamp: 3;    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.45);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #5aaf0b; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #4a9109; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cdiv class="tg-df-carousel-roundels">            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>            \x3Cdiv class="tg-df-roundel tg-df-roundel-skeleton">\x3Cdiv class="tg-df-roundel-img-box tg-df-skeleton">\x3C/div>\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="margin: 4px auto 0 auto; height: 13px; width: 48px;">\x3C/div>\x3C/div>          \x3C/div>          \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>\n        \x3C/div>\n      \x3C/div>\n    \x3C/div>          \x3C!-- Search & Filter Controls --\x3E    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">      \x3Cdiv class="tg-df-top-bar">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>                \x3Cdiv class="tg-df-settings-wrapper">          \x3Cbutton type="button" class="tg-df-settings-btn" aria-label="Settings" id="tg-df-settings-toggle">            \x3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">                \x3Cpath d="M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.06-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.73 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.06.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .43-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.49-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"/>            \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-settings-dropdown-backdrop" id="tg-df-settings-backdrop">\x3C/div>          \x3Cdiv class="tg-df-settings-dropdown" id="tg-df-settings-panel">            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Search Region\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-region-select">                \x3Coption value="auto">🌍 Auto-detect\x3C/option>                \x3Coption value="US">🇺🇸 United States (US)\x3C/option>                \x3Coption value="GB">🇬🇧 United Kingdom (UK)\x3C/option>                \x3Coption value="CA">🇨🇦 Canada (CA)\x3C/option>                \x3Coption value="AU">🇦🇺 Australia (AU)\x3C/option>                \x3Coption value="DE">🇩🇪 Germany (DE)\x3C/option>                \x3Coption value="FR">🇫🇷 France (FR)\x3C/option>                \x3Coption value="IT">🇮🇹 Italy (IT)\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Retailer\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-retailer-select">                \x3Coption value="">All Retailers\x3C/option>                \x3Coption value="Amazon">Amazon\x3C/option>                \x3Coption value="Walmart">Walmart\x3C/option>                \x3Coption value="Best Buy">Best Buy\x3C/option>                \x3Coption value="Target">Target\x3C/option>                \x3Coption value="John Lewis">John Lewis\x3C/option>                \x3Coption value="Currys">Currys\x3C/option>                \x3Coption value="Argos">Argos\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Offer Type\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-offer-type-select">                \x3Coption value="">All Offers\x3C/option>                \x3Coption value="amazon_prime">Amazon Prime\x3C/option>                \x3Coption value="recommended_promo">Recommended Promo\x3C/option>                \x3Coption value="amazon_lightning">Amazon Lightning Deal\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">Result Count\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-rows-select">                \x3Coption value="3">3 Items\x3C/option>                \x3Coption value="4">4 Items\x3C/option>                \x3Coption value="6">6 Items\x3C/option>                \x3Coption value="12" selected>12 Items\x3C/option>                \x3Coption value="24">24 Items\x3C/option>                \x3Coption value="48">48 Items\x3C/option>              \x3C/select>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Deal Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Only show products with active offers or previous prices (was_price)\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-deal-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item tg-df-dl-row">              \x3Cdiv>                \x3Cspan class="tg-df-dl-row-text">Editor Mode\x3C/span>                \x3Cspan class="tg-df-dl-row-subtext">Enable multi-select to copy deals to CMS\x3C/span>              \x3C/div>              \x3Clabel class="tg-df-toggle">                \x3Cinput type="checkbox" id="tg-df-editor-mode">                \x3Cspan class="tg-df-slider">\x3C/span>              \x3C/label>            \x3C/div>            \x3Cdiv class="tg-df-setting-item">              \x3Clabel class="tg-df-setting-label">View Mode\x3C/label>              \x3Cselect class="tg-df-region-select" id="tg-df-view-mode-select">                \x3Coption value="auto">Auto Collection\x3C/option>                \x3Coption value="carousel">Carousel\x3C/option>                \x3Coption value="savings_squad">Savings Squad\x3C/option>                \x3Coption value="grid">Grid (Columns)\x3C/option>                \x3Coption value="row">Row (List)\x3C/option>              \x3C/select>            \x3C/div>          \x3C/div>        \x3C/div>      \x3C/div>      \x3Cdiv class="tg-df-filters">        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3z"/>          \x3C/svg>          \x3Cselect class="tg-df-sort-select" aria-label="Sort Deals">            \x3Coption value="date_desc">Newest First\x3C/option>            \x3Coption value="best_match">Sort by: Match\x3C/option>            \x3Coption value="price_asc">Price Low to High\x3C/option>            \x3Coption value="price_desc">Price High to Low\x3C/option>            \x3Coption value="discount_desc">Biggest Discount\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>        \x3C/div>      \x3C/div>    \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();            if (['carousel', 'carousel-compact', 'auto', 'grid', 'row'].includes(this.getViewMode())) { this.loadCarouselSpreadsheet(); }        }        getViewMode() {          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          if (mode === 'carousel' || mode === 'auto' || mode === 'grid' || mode === 'row') {             if (mode === 'carousel') this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container') && mode === 'carousel') {               this.root.classList.add('is-carousel');             } else if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Everything';             if (this.discountFilter && !params.has('min_discount_ratio')) {               this.discountFilter.value = '5';             }          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (params.has('bg_color')) {            const bg = params.get('bg_color');            if (bg === 'white') {              this.root.style.setProperty('background-color', '#ffffff', 'important');            } else if (bg === 'transparent') {              this.root.style.setProperty('background-color', 'transparent', 'important');            } else if (bg === 'light_blue') {              this.root.style.setProperty('background-color', '#E7F0FF', 'important');            }          } else {             this.root.style.removeProperty('background-color');          }                    if (params.has('view_mode')) {            if (this.viewModeSelect) {              this.viewModeSelect.value = params.get('view_mode');            } else {              this.viewModeOverride = params.get('view_mode');            }          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'discount_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            this.searchInput.value = this.currentQuery;          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'discount_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const roundels = this.root.querySelectorAll('.tg-df-carousel-cat.original-hardcoded');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              if (this.getViewMode() === 'savings_squad' && this.autocompleteDropdown && this.airedaleTags && query.length > 0) {                 const matches = this.airedaleTags.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase()).slice(0, 5);                 if (matches.length > 0) {                    this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                    this.autocompleteDropdown.classList.add('active');                 } else {                    this.autocompleteDropdown.classList.remove('active');                 }              } else if (this.autocompleteDropdown) {                 this.autocompleteDropdown.classList.remove('active');              }              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  this.deals = [];                  this.render();                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                this.activeDealTag = null;                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });              this.activeDealTag = null;              this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.fetchDeals(query);              }            });          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = this.viewModeSelect.value === 'savings_squad' ? 'date_desc' : 'discount_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }                async loadCarouselSpreadsheet() {          try {              const parseCSVRow = (str) => {                  let result = [], cur = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (inQuotes) {                          if (char === '"') {                              if (str[i + 1] === '"') { cur += '"'; i++; }                              else { inQuotes = false; }                          } else { cur += char; }                      } else {                          if (char === '"') { inQuotes = true; }                          else if (char === ',') { result.push(cur); cur = ''; }                          else { cur += char; }                      }                  }                  result.push(cur); return result;              };              const parseCSV = (str) => {                  const rows = []; let curRow = '', inQuotes = false;                  for (let i = 0; i < str.length; i++) {                      let char = str[i];                      if (char === '"') inQuotes = !inQuotes;                      if ((char === '\n' || char === '\r') && !inQuotes) {                          if (char === '\r' && str[i+1] === '\n') i++;                          if (curRow) rows.push(parseCSVRow(curRow));                          curRow = '';                      } else { curRow += char; }                  }                  if (curRow) rows.push(parseCSVRow(curRow));                  return rows;              };              const preloadedCSV = decodeURIComponent(escape(atob("LCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNQ0KUm91bmRlbCB0ZXh0LEFsbCxUVnMsRm9vdHdlYXIsQXBwYXJlbCxNYXR0cmVzZXMsQXBwbGlhbmNlcyxXZWFyYWJsZSB0ZWNoLEhlYWRwaG9uZXMsU21hcnQgSG9tZSxTcGVha2VycyxMYXB0b3BzLFRhYmxldHMsQ29tcHV0aW5nLFBob25lcyxHYW1pbmcsTGVnbw0KUm91bmRlbCBpbWFnZSxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2FpLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3R2cy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvN2IzYTIyNGIwNzk2M2M2MjdiNmI5MDliZDc4MzM4MzZlMDJmZjgxOS5qcGcud2VicCxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy84NGRhYzVkNDhlZDJkNDQ4NTU5ZWJhNjdhY2U4MzE0Y2M2N2NjZDk0LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvbWF0dHJlc3Nlcy5wbmcsaHR0cHM6Ly9pbWFnZXMuZmllLmZ1dHVyZWNkbi5uZXQvcHJvZHVjdHMvNzY4ZTk3Y2ViMDcxODAxZmFlMjA5MTBkMDgyMGIxNmY3NDdhZjkzOS5qcGcud2VicCxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3dlbGxuZXNzLnBuZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL2hlYWRwaG9uZXMuanBnLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzg5NTM1YmVlYmUyMGRiYmQ0YTM0NmQ2ZDZiZGZlOTFkOGE4ODRhMjEuanBnLndlYnAsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9hdWRpby5qcGcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9sYXB0b3BzLmpwZyxodHRwczovL2ltYWdlcy5maWUuZnV0dXJlY2RuLm5ldC9wcm9kdWN0cy8yMzk3NTY0ZWQ3YTVmZjk0N2U5YjZiMzBlNTRmNDc0OTRiODQxZjg5LmpwZy53ZWJwLGh0dHBzOi8vd3d3LnRvbXNndWlkZS5jb20vcHJvZHVjdHMvY2Fyb3VzZWwvY29tcHV0aW5nLmpwZyxodHRwczovL3d3dy50b21zZ3VpZGUuY29tL3Byb2R1Y3RzL2Nhcm91c2VsL3Bob25lcy5wbmcsaHR0cHM6Ly93d3cudG9tc2d1aWRlLmNvbS9wcm9kdWN0cy9jYXJvdXNlbC9nYW1pbmcucG5nLGh0dHBzOi8vaW1hZ2VzLmZpZS5mdXR1cmVjZG4ubmV0L3Byb2R1Y3RzLzRmNmM2MjFjYWMwYmMxYTg1ZDU5M2UzNTk0YmE1YjM0OWVmZmQyOTIuanBnLndlYnANClNlYXJjaCBRdWVyeSxFdmVyeXRoaW5nLFRlbGV2aXNpb25zLCJTbmVha2VycywgcnVubmluZyBzaG9lcywgc2FuZGFscyIsQ2xvdGhpbmcsTWF0dHJlc3NlcyxIb21lIEFwcGxpYW5jZXMsV2VhcmFibGVzICYgRml0bmVzcyBUZWNoLEhlYWRwaG9uZXMsSG9tZSBUZWNoLFNwZWFrZXJzLExhcHRvcHMsVGFibGV0cyxDb21wdXRpbmcsUGhvbmVzLEdhbWluZyxDb25zdHJ1Y3Rpb24gVG95cw0KRGlzY291bnQgQW1vdW50LG1pbiA1JSxtaW4gMTAlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUsbWluIDUlLG1pbiA1JSxtaW4gNSUNClByaWNlIFJhbmdlLCwsLCxtaW4gJDQwMCwsLCxtaW4gJDI1LCxtaW4gJDMwMCwsLG1pbiAkMTAwLCwNCkJyYW5kIFNlbGVjdGlvbiwsLCwsLCwsLCwsLCwsLCwNCkZpbHRlciBidXR0b25zLCwsLCwsLCwsLCwsLCwsLA0KMSxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMsTGlnaHRuaW5nIGRlYWxzLExpZ2h0bmluZyBkZWFscyxMaWdodG5pbmcgZGVhbHMNCjIsQW1hem9uIGRlYWxzLFVuZGVyICQxMDAwLDUwJSBvZmYsQWRpZGFzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsNTAlIG9mZixBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscyxBbWF6b24gZGVhbHMsQW1hem9uIGRlYWxzLEFtYXpvbiBkZWFscw0KMyxPdmVyICQ0MDAsVW5kZXIgJDUwMCxIb2thLE5pa2UsU2FhdHZhLE5pbmphLDQwJSBvZmYsSkxhYiwsSkJMLERlbGwsLEFzdXMsQXBwbGUsQ29uc29sZXMsU3RhciBXYXJzDQo0LFVuZGVyICQxMDAwLDUwJSBvZmYsU2tlY2hlcnMsVW5kZXIgQXJtb3VyLEhlbGl4LFNoYXJrLEdhcm1pbixBbmtlciBTb3VuZGNvcmUsUmluZyxTb25vcyxBcHBsZSxBcHBsZSxUUC1saW5rLFNhbXN1bmcsQWNjZXNzb3JpZXMsVW5kZXIgJDI1DQo1LFVuZGVyICQ1MDAsTEcsQXNpY3MsQ29sdW1iaWEsRHJlYW1DbG91ZCxLZXVyaWcsQXBwbGUsU29ueSxHb3ZlZSxUcmliaXQsTGVub3ZvLFNhbXN1bmcsRWVybyxHb29nbGUsR2FtZXMsVW5kZXIgJDUwDQo2LDUwJSBvZmYsU2Ftc3VuZyxOaWtlLFBhdGFnb25pYSxOZWN0YXIsRGUnTG9uZ2hpLEFtYXpmaXQsQXBwbGUsS2FzYSBzbWFydCxTb255LEFsaWVud2FyZSxUQ0wsTmV0Z2VhcixNb3Rvcm9sYSxOaW50ZW5kbyxCb3RhbmljYWxzDQo3LEFtYXpvbixIaXNlbnNlLE5ldyBCYWxhbmNlLEFyYyd0ZXJ5eCxUZW1wdXItcGVkaWMsRHlzb24sRml0Yml0LEJlYXRzLFBoaWxpcHMgSHVlLEFua2VyLEFjZXIsT25lUGx1cyxEZWxsLE9uZVBsdXMsU29ueSxEaXNuZXkNCjgsQXBwbGUsVENMLEFkaWRhcyxDYXJoYXJ0dCxCZWFyLEJpc3NlbGwsU2Ftc3VuZyxFYXJmdW4sQmxpbmssQmVhdHMsTVNJLE1pY3Jvc29mdCxBY2VyLE5vdGhpbmcsWGJveCxNYXJ2ZWwNCjksLFNvbnksU2F1Y29ueSxUaGUgTm9ydGggRmFjZSxTaWVuYSxOdXRyaWJ1bGxldCxPdXJhLFNhbXN1bmcsR29vZ2xlIE5lc3QgLE1hcnNoYWxsLFNhbXN1bmcsTGVub3ZvLExlbm92bywsLFBva2Vtb24NCjEwLCxSb2t1LEJpcmtlbnN0b2NrLENSWiBZb2dhLFdpbmtCZWRzLEJsYWNrIGFuZCBEZWNrZXIsUmluZ2Nvbm4sQ01GLEV1ZnksU2Ftc3VuZyxNaWNyb3NvZnQsUmVNYXJrYWJsZSxBbGllbndhcmUsLCwNCjExLCwsQnJvb2tzLFRoZSBHeW0gUGVvcGxlLEJyb29rbHluIGJlZGRpbmcsTmVzcHJlc3NvLCwxTW9yZSxBcmxvLCxSYXplciwsQ29yc2FpciwsLA0KMTIsLCxDcm9jcywsRWlnaHQgU2xlZXAsQ3Vpc2luYXJ0LCxKQkwsLCwsLEhQLCwsDQpOb3RlcywsLCwsLCwsLCwsLCwsLCwNCiwsIlByaW9yaXRpc2UgYmlnZ2VzdCAlLyQgZGlzY291bnQsIFR2cyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiB0aGUgbW9zdCBwb3B1bGFyIGV2ZW4gaWYgdGhleSBhcmUgc3RpbGwgZXhwZW5zaXZlIiwiTm8gcGF0dGVybiB0byBwcmljaW5nL2Rpc2NvdW50LCByZWFkZXJzIG1haW5seSBzaG9wIGJ5IGJyYW5kL3JlY29nbmlzYWJsZSBzaG9lcyIsIk5vIHBhdHRlcm4gdG8gcHJpY2luZy9kaXNjb3VudCwgcmVhZGVycyBtYWlubHkgc2hvcCBieSBicmFuZCIsIkEgbGFiZWwgd2lsbCBkZWZpbml0ZWx5IGhlbHAgaGVyZSBlLmcuIGJlc3QgZm9yIHNpZGUgc2xlZXBlciwgYmVzdCBtZW1vcnkgZm9hbSIsIkFwcGxpYW5jZXMgaXMgYSBiaWcgY2F0ZWdvcnksIGlzIGl0IHBvc3NpYmxlIHRvIHNwbGl0IGludG8ga2l0Y2hlbiBhcHBsaWFuY2VzLCBmbG9vcmNhcmUsIGFpciBoZWFsdGgvY29vbGluZz8gT3Igc2ltaWxhciIsIkZvY3VzIG9uIHZhbHVlIGZvciBtb25leSwgR2FybWlucyB3aXRoIH41MCUgb2ZmIGhhdmUgYmVlbiBwb3B1bGFyIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHN0aWxsICQ1MDAiLCwsLCxJbmNsdWRlIEtpbmRsZXMsSSB3b3VsZCBpbmNsdWRlIHdpZmkgcm91dGVycyBoZXJlIGluc3RlYWQgb2Ygc21hcnQgaG9tZSxDYW4gd2Ugc3VyZmFjZSBwaG9uZSBwcm92aWRlciBkZWFscz8gVC1tb2JpbGUgYW5kIHZlcml6b24gd291bGQgbWFrZSBhIGxvdCBtb3JlIG1vbmV5IHRoYW4gQW1hem9uLCwNCiwsaGF2aW5nIGEgJ2Jlc3QgZm9yJyBsYWJlbCB3b3VsZCBiZSBoZWxwZnVsIGUuZy4gYmVzdCBmb3IgYnJpZ2h0IHJvb20sQ2FuIHdlIHN0b3Aga2lkcyBzaG9lcyBmcm9tIHB1bGxpbmcgdGhyb3VnaD8sIldpbGwgdGhpcyBpbmNsdWRlIGFjY2Vzc29yaWVzIGUuZy4gY2FwcywgYmFncywgaWYgc28gbWFrZSBzdXJlIHRoZXNlIGFyZSBtaXhlZCB0aHJvdWdob3V0IGNsb3RoaW5nIGRlYWxzIixXaWxsIHRoaXMgaW5jbHVkZSB0b3BwZXJzIGFuZCBwaWxsb3dzPyBTZWVpbmcgbW9yZSBtb21lbnR1bSB3aXRoIHRoaXMgY2F0ZWdvcnkgcmVjZW50bHkgc28gYSBiZWRkaW5nIHRhYiBtaWdodCB3b3JrLCwiTmVlZCB0byBtYWtlIHN1cmUgYmFuZHMsIHNjcmVlbiBwcm90ZWN0b3JzIGV0Yy4gZG9uJ3QgcHVsbCBpbnRvIGhlcmUiLCwsLCwsLCwsDQosLCJQcmlvcml0aXNlIDY1JycgYW5kIDU1JyBpbmNoIFRWcywgdGhlbiBiaWdnZXIgc2NyZWVucyBiZWZvcmUgdGhlIHNtYWxsZXIgc2l6ZXMiLCwsUXVlZW4gaXMgdGhlIG1vc3QgcG9wdWxhciBzaXplIGluIHRoZSBVUyAtIHByaW9yaXRpc2UgZGVhbHMgZm9yIHRoaXMgc2l6ZSwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpDYXRlZ29yaWVzIHRvIGNvbnNpZGVyLCxQcm9kdWN0cyBpbmNsdWRlZCwsLCwsLCwsLCwsLCwsDQpVbmRlciAkNTA/LCxBaXIgdGFncywsLCwsLCwsLCwsLCwsDQosLFBvcnRhYmxlIGNoYXJnZXJzL3dpcmVsZXNzIGNoYXJnZXJzLCwsLCwsLCwsLCwsLCwNCiwsIldhdGVyIGJvdHRsZXMgKHN0YW5sZXlzLCBPd2FsYSwgSHlkcm8gZmxhc2ssIFlldGkpIiwsLCwsLCwsLCwsLCwsDQosLEhhbmQgaGVsZCBmYW5zLCwsLCwsLCwsLCwsLCwNCiwsLCwsLCwsLCwsLCwsLCwNCmhvbWUgb2ZmaWNlLCxvZmZpY2UgY2hhaXJzLCwsLCwsLCwsLCwsLCwNCiwsc3RhbmRpbmcgZGVza3MsLCwsLCwsLCwsLCwsLA0KLCxtb25pdG9ycywsLCwsLCwsLCwsLCwsDQosLEtleWJvYXJkcywsLCwsLCwsLCwsLCwsDQosLGRvY2tpbmcgc3RhdGlvbiwsLCwsLCwsLCwsLCwsDQosLCwsLCwsLCwsLCwsLCwsDQpHYW1pbmcsLENvbnNvbGVzLCwsLCwsLCwsLCwsLCwNCiwsQWNjZXNzb3JpZXMsLCwsLCwsLCwsLCwsLA0KLCxHYW1lcywsLCwsLCwsLCwsLCwsDQosLENvdWxkIGluY2x1ZGUgTGVnbz8sLCwsLCwsLCwsLCwsLA==")));              const text = preloadedCSV;              const parsed = parseCSV(text);                            const rowsByName = {};              let filterStart = -1;              parsed.forEach((rc, i) => {                 if (rc && rc.length > 0 && rc[0]) rowsByName[rc[0]] = rc;                 if (rc && rc.length > 0 && rc[0] === 'Filter buttons') filterStart = i;              });                            const cols = [];              if(rowsByName['Roundel text']) {                const headerRow = rowsByName['Roundel text'];                for(let col = 1; col < headerRow.length; col++) {                   let label = headerRow[col];                   if (!label) continue;                                      let q = rowsByName['Search Query'] && rowsByName['Search Query'][col] ? rowsByName['Search Query'][col] : '';                   let img = rowsByName['Roundel image'] && rowsByName['Roundel image'][col] ? rowsByName['Roundel image'][col] : '';                   let ds = rowsByName['Discount Amount'] && rowsByName['Discount Amount'][col] ? rowsByName['Discount Amount'][col] : '';                   let pr = rowsByName['Price Range'] && rowsByName['Price Range'][col] ? rowsByName['Price Range'][col] : '';                   let rt = rowsByName['Retailer'] && rowsByName['Retailer'][col] ? rowsByName['Retailer'][col] : '';                   let ot = rowsByName['Offer Type'] && rowsByName['Offer Type'][col] ? rowsByName['Offer Type'][col] : '';                                      let filters = [];                   if(filterStart > 0) {                     for(let r = filterStart + 1; r < parsed.length; r++) {                         if(!parsed[r] || parsed[r][0] === 'Notes' || parsed[r][0] === 'Categories to consider') break;                         let f = parsed[r][col];                         if(f) filters.push(f);                     }                   }                   cols.push({ label, img, q, ds, pr, rt, ot, filters });                }              }              this.carouselData = cols;              if (this.carouselData && this.carouselData.length > 0) {                 const isMatched = this.carouselData.some(c => c.q === this.currentQuery || c.label === this.currentQuery);                 if (!isMatched) {                    const first = this.carouselData[0];                    this.currentQuery = first.q || first.label;                    if (this.priceFilter) this.priceFilter.value = 'all';                    if (this.customPriceMin) this.customPriceMin.value = '';                    if (this.customPriceMax) this.customPriceMax.value = '';                    let dPr = first.pr || 'all';                    if (typeof dPr === 'string' && dPr !== 'all') {                       let prLower = dPr.toLowerCase();                       if (prLower.includes('min') || prLower.includes('over')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else if (prLower.includes('max') || prLower.includes('under')) {                          let m = dPr.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       }                    }                    let dAm = '0';                    if(first.ds && typeof first.ds === 'string') {                       let m = first.ds.match(/(\d+)/);                       if(m) dAm = m[1];                    }                    if (this.discountFilter) this.discountFilter.value = dAm;                    if (this.offerTypeSelect) this.offerTypeSelect.value = first.ot || '';                    if (this.retailerSelect) this.retailerSelect.value = first.rt || '';                    this.selectedBrands = [];                    if (this.brandDropdown) {                        const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                        chks.forEach(chk => chk.checked = false);                    }                    if (this.searchInput) this.searchInput.value = this.currentQuery;                 }              }              this.renderCarouselUI();          } catch(e){ console.warn(e); }        }                renderCarouselUI() {           const roundelWrapper = this.root.querySelector('.tg-df-carousel-roundels');           if(!roundelWrapper || !this.carouselData) return;                      let html = '';           this.carouselData.forEach(r => {              const q = r.q || r.label;              const isActive = (this.currentQuery === q || this.currentQuery === r.label) ? 'active' : '';              const imgHtml = r.img ? `\x3Cimg src="${r.img}" alt="${r.label}" />` : `\x3Csvg width="32" height="32" fill="#1F69FF" viewBox="0 0 24 24">\x3Cpath d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>\x3C/svg>`;              html += `                \x3Cdiv class="tg-df-roundel tg-df-carousel-cat ${isActive}" data-label="${this.escapeHTML(r.label)}">                  \x3Cdiv class="tg-df-roundel-img-box">${imgHtml}\x3C/div>                  \x3Cspan class="tg-df-roundel-label">${this.escapeHTML(r.label)}\x3C/span>                \x3C/div>              `;           });           roundelWrapper.innerHTML = html;                      // Rebind clicks           const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');           roundels.forEach(rNode => {             rNode.addEventListener('click', () => {                const r = this.carouselData.find(c => c.label === rNode.getAttribute('data-label'));                 if(!r) return;                                  if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: r.label,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = r.q || r.label;                const labelTitle = this.root.querySelector('#tg-df-carousel-title-label');                if (labelTitle) labelTitle.textContent = 'Best ' + this.currentQuery;                if (this.priceFilter) this.priceFilter.value = 'all';                if (this.customPriceMin) this.customPriceMin.value = '';                if (this.customPriceMax) this.customPriceMax.value = '';                let dPr = r.pr || 'all';                if (typeof dPr === 'string' && dPr !== 'all') {                   let prLower = dPr.toLowerCase();                   if (prLower.includes('min') || prLower.includes('over')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMin) this.customPriceMin.value = m[1];                   } else if (prLower.includes('max') || prLower.includes('under')) {                      let m = dPr.match(/(\d+)/);                      if (m && this.customPriceMax) this.customPriceMax.value = m[1];                   }                }                                let discountAmount = '0';                if(r.ds && typeof r.ds === 'string') {                   let m = r.ds.match(/(\d+)/);                   if(m) discountAmount = m[1];                }                if (this.discountFilter) this.discountFilter.value = discountAmount;                if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                                // Clear brands                    this.selectedBrands = [];                    if (this.brandDropdown) {                    const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                    chks.forEach(chk => chk.checked = false);                }                                if (this.searchInput) this.searchInput.value = this.currentQuery;                                roundels.forEach(ro => ro.classList.remove('active'));                if (rNode) rNode.classList.add('active');                                this.renderCarouselFilters(r);                this.fetchDeals(this.currentQuery);             });           });                      // Auto-highlight active           const activeR = this.carouselData.find(c => c.q === this.currentQuery || c.label === this.currentQuery);           if(activeR) this.renderCarouselFilters(activeR);        }                renderCarouselFilters(r) {           const filtersWrap = this.root.querySelector('.tg-df-carousel-filters-wrap');           if(!filtersWrap) return;                      let html = `\x3Cbutton class="tg-df-carousel-filter-btn" data-type="all">All\x3C/button>`;                      r.filters.forEach(f => {              let fL = f.toLowerCase();              let icon = '';              let logic = `data-type="custom" data-v="${this.escapeHTML(f)}"`;              if (fL === 'amazon deals' || fL === 'prime deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>`;              } else if (fL === 'lightning deals') {                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>\x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>`;              } else {                 if (fL.includes('lightning')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-zap">\x3Cpolygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2">\x3C/polygon>\x3C/svg>`;                 } else if (fL.includes('% off')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>`;                 } else if (fL.includes('under') || fL.includes('min ')) {                    icon = `\x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>`;                 }                 html += `\x3Cbutton class="tg-df-carousel-filter-btn" ${logic}>${icon} ${this.escapeHTML(f)}\x3C/button>`;              }           });                      filtersWrap.innerHTML = html;                      const btns = filtersWrap.querySelectorAll('button');           btns.forEach(b => {             b.addEventListener('click', () => {                const type = b.getAttribute('data-type');                if (type === 'custom') {                   const v = b.getAttribute('data-v');                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-custom-${(v||'').toLowerCase().replace(/[^a-z0-9]+/g, '-')}`, name: 'Custom Filter', label: v });                }                if (type === 'all') {                   if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: 'filter-clear-all', name: 'Clear all', label: 'Clear all filters' });                   // reset everything                   btns.forEach(btn => btn.classList.remove('active'));                   b.classList.add('active');                                      // Reset prices                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   if (this.brandDropdown) {                     const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                     chks.forEach(chk => chk.checked = false);                   }                } else {                   const v = b.getAttribute('data-v');                   const fL = v.toLowerCase();                                      let mapRet = ['amazon', 'walmart', 'best buy', 'target', 'john lewis', 'currys', 'argos'];                   const getCategory = (s) => {                      if (s === 'lightning deals' || s === 'amazon deals' || s === 'prime deals') return 'offer';                      if (s.includes('% off')) return 'discount';                      if (s.includes('under') || s.includes('over') || s.includes('min') || s.includes('max')) return 'price';                      if (mapRet.includes(s)) return 'retailer';                      return 'brand';                   };                   const cat = getCategory(fL);                   const wasActive = b.classList.contains('active');                   if (cat !== 'brand') {                      btns.forEach(btn => {                          if (btn === b) return;                          if (btn.getAttribute('data-type') === 'all') return;                          const bV = btn.getAttribute('data-v');                          if (!bV) return;                          if (getCategory(bV.toLowerCase()) === cat) btn.classList.remove('active');                      });                   }                   if (wasActive) b.classList.remove('active');                   else b.classList.add('active');                   let anyActive = Array.from(btns).some(btn => btn !== btns[0] && btn.classList.contains('active'));                   if (!anyActive) {                       btns[0].click();                       return;                   } else {                       btns[0].classList.remove('active');                   }                                      if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.customPriceMin) this.customPriceMin.value = '';                   if (this.customPriceMax) this.customPriceMax.value = '';                   let dPr = r.pr || 'all';                   if (typeof dPr === 'string' && dPr !== 'all') {                      let prLower = dPr.toLowerCase();                      if (prLower.includes('min') || prLower.includes('over')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMin) this.customPriceMin.value = m[1];                      } else if (prLower.includes('max') || prLower.includes('under')) {                         let m = dPr.match(/(\d+)/);                         if (m && this.customPriceMax) this.customPriceMax.value = m[1];                      }                   }                                      let discountAmount = '0';                   if(r.ds && typeof r.ds === 'string') {                      let m = r.ds.match(/(\d+)/);                      if(m) discountAmount = m[1];                   }                   if (this.discountFilter) this.discountFilter.value = discountAmount;                   if (this.offerTypeSelect) this.offerTypeSelect.value = r.ot || '';                   if (this.retailerSelect) this.retailerSelect.value = r.rt || '';                   this.selectedBrands = [];                   btns.forEach(btn => {                       if (!btn.classList.contains('active') || btn.getAttribute('data-type') === 'all') return;                       const vv = btn.getAttribute('data-v');                       const vl = vv.toLowerCase();                                              if (vl === 'lightning deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_lightning';                       } else if (vl === 'amazon deals' || vl === 'prime deals') {                          if (this.offerTypeSelect) this.offerTypeSelect.value = 'amazon_prime';                       } else if (vl.includes('% off')) {                          let m = vl.match(/(\d+)%/);                          if (m && this.discountFilter) this.discountFilter.value = m[1];                       } else if (vl.includes('under') || vl.includes('max')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMax) this.customPriceMax.value = m[1];                       } else if (vl.includes('min') || vl.includes('over')) {                          let m = vl.match(/(\d+)/);                          if (m && this.customPriceMin) this.customPriceMin.value = m[1];                       } else {                          let foundR = mapRet.find(x => x === vl);                          if (foundR) {                             let realR = ['Amazon', 'Walmart', 'Best Buy', 'Target', 'John Lewis', 'Currys', 'Argos'].find(x => x.toLowerCase() === vl);                             if (this.retailerSelect) this.retailerSelect.value = realR;                          } else {                             this.selectedBrands.push(vv);                          }                       }                   });                                      if (this.brandDropdown) {                       const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                       chks.forEach(c => c.checked = this.selectedBrands.includes(c.value));                   }                                      if (r.pr && typeof r.pr === 'string') {                       let prL = r.pr.toLowerCase();                       if (prL.includes('under $')) {                           let m = prL.match(/under \$(\d+)/i);                           if (m && this.customPriceMax && !this.customPriceMax.value) this.customPriceMax.value = m[1];                       }                   }                }                                this.fetchDeals(this.currentQuery);             });           });                      // default to highlighting first           btns[0].classList.add('active');        }async fetchDeals(query, append = false) {          if (!append) {             this.showLoading();             this.deals = [];             this.displayLimit = (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          } else {             this.displayLimit += (this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12;          }                    try {            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad(append);            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query, append);               } else {                 await this.fetchHawkDeals(query, append);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query, append);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (this.activeDealTag) {             const encodedTag = encodeURIComponent(this.activeDealTag.toLowerCase().replace(/\s+/g, '-'));             const url = `https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=tomsguide&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let dynamicBrandsCounts = {};                    targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                   dynamicBrandsCounts[data.brand] = (dynamicBrandsCounts[data.brand] || 0) + 1;                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || ''                });             });          });                    const airedaleBrandsList = Object.keys(dynamicBrandsCounts).map(b => ({              formatted_value: b,              count: dynamicBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query, append = false) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (append && this.deals.length > 0) {            url.searchParams.append('offset', this.deals.length.toString());          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    if (this.rowsSelect && this.rowsSelect.value) {            url.searchParams.append('rows', this.rowsSelect.value);          } else {             url.searchParams.append('rows', '12'); // default          }          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = 12;          if (this.rowsSelect && this.rowsSelect.value) {            rowLimit = parseInt(this.rowsSelect.value, 10) || 12;          }          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : (this.getViewMode() === 'savings_squad' ? 'date_desc' : 'discount_desc');          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin-top:8px;">${_div}                ${_div}              ${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map(v => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              return `                \x3Ca href="${this.escapeHTML(linkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item">                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)} (${this.airedaleTagCounts[tag] || 0})${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = isSavingsSquadMode ? 'View Deal' : 'Check Price';              if (isSavingsSquadMode) {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                  ${_div}                `;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-merchant-wrapper">                    \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = `                \x3Cdiv class="tg-df-card-merchant-wrapper">                  \x3Cspan class="tg-df-card-merchant-pill" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                ${_div}                \x3Cdiv class="tg-df-card-price-group">                  ${isSavingsSquadMode ? '' : `                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                  `}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description">\x3Cp>${this.escapeHTML(deal.description)}${_p}${_div}` : ''}                      ${_div}                    ${_div}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>${deal.isCheckPrice ? 'Check Price' : 'View Deal'}${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cp style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 12px; line-height: 1.4;">${this.escapeHTML(deal.description)}${_p}` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${priceGroupHtml}                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta ${isSavingsSquadMode ? 'tg-df-cta-savings-squad' : ''}" style="text-decoration: none;">${ctaText}${_a}                  ${_div}                ${_div}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit || ((this.getViewMode() === 'carousel' || this.getViewMode() === 'auto') && displayDeals.length > 0 && displayDeals.length % ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12) === 0)) {            if (this.getViewMode() === 'carousel') {               dealsHtml += `                 \x3Cbutton type="button" class="tg-df-load-more-card tg-df-load-more">                   \x3Csvg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom: 8px;">\x3Cpath d="M5 12h14">\x3C/path>\x3Cpath d="m12 5 7 7-7 7">\x3C/path>\x3C/svg>                   Load More                 ${_button}               `;            } else {               dealsHtml += `                 \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                   \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer; display: flex; align-items: center;">Load More${_button}                 ${_div}               `;            }          }                    this.grid.innerHTML = dealsHtml;                    let gridWrapper = this.grid.parentElement;          if (gridWrapper && gridWrapper.classList.contains('tg-df-grid-wrapper')) {             let existingChevron = gridWrapper.querySelector('.tg-df-carousel-scroll-right');             if (this.getViewMode() === 'carousel') {                 if (!existingChevron) {                     gridWrapper.insertAdjacentHTML('beforeend', '\n                 \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.previousElementSibling.scrollBy({left: 200, behavior: \'smooth\'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>');                 }             } else {                 if (existingChevron) {                     existingChevron.remove();                 }             }          }                    const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', async () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              if (displayDeals.length <= this.displayLimit) {                 loadMoreBtn.innerHTML = `                  <svg class="tg-df-spinner" style="width: 16px; height: 16px; display: inline-block; vertical-align: middle; margin-right: 8px;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83"/></svg>                  Loading...                 `;                 loadMoreBtn.disabled = true;                 await this.fetchDeals(this.currentQuery, true);              } else {                 this.displayLimit += ((this.rowsSelect && this.rowsSelect.value) ? parseInt(this.rowsSelect.value, 10) : 12);                 this.render();              }            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            setTimeout(() => {               if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            if (!this.processArticleFired) {                  this.processArticleFired = true;                  document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));               }            }, 50);          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI Osmo Pocket 4: two US-only AliExpress codes have landed, and they’re gone after June 30 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-pocket-4-aliexpress-codes</link>
                                                                            <description>
                            <![CDATA[ DJI Osmo Pocket 4: two US-only AliExpress codes have landed, and they’re gone after June 30 ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ZrYwPuLmWicdiZhR2Axwsi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/QD9u6T39KMHHMQDnk4jixQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 02 Jun 2026 16:46:19 +0000</pubDate>                                                                                                                                <updated>Tue, 16 Jun 2026 10:49:52 +0000</updated>
                                                                                                                                            <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                                    <dc:creator><![CDATA[ Nathan Walters ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/SrGsFnCdBA6mk62P5mBVuN.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nathan is an SEO copywriter for the vouchers team, so he knows how to save on the latest tech and games. Starting as a Deals Finder for MyVoucherCodes, he used his money-saving skills to&lt;a href=&quot;https://www.myvouchercodes.co.uk/resources/technology&quot;&gt; &lt;u&gt;write blogs and money-saving content about tech retailers&lt;/u&gt;&lt;/a&gt;. He has since covered topics such as graphics cards, mobile phones, game consoles and TVs for sites like PC Gamer, TechRadar, and Tom’s Hardware. He has also written money-saving advice for multiple publications such as Moneynet, NationalWorld, iPaper, Pick Me Up! And My Weekly. In addition to saving people money on their new tech, Nathan loves gaming and building PCs and is always looking for a good deal on graphics cards or video game keys.&lt;/p&gt;&lt;p&gt;Nathan has worked at Future since 2022 and has written about various big sale events such as Black Friday, Amazon Prime Day, Cyber Monday, and Christmas. His Deal Finder experience, combined with his voucher writing experience, has given him the skills needed to find amazing deals and update you on the latest and best ways to save on your next purchase. Nathan’s work has helped readers find the best-value gaming monitors, games, TVs, and streaming sites.&lt;/p&gt;&lt;p&gt;&lt;br&gt;Born in the South Wales Valleys, Nathan is an avid video game and tabletop player who loves writing. When not finding tech deals, he can be found playing the latest games, playing D&amp;D, or writing game reviews for his website,&lt;a href=&quot;https://www.gamereport.co.uk/&quot;&gt; &lt;u&gt;GameReport&lt;/u&gt;&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/QD9u6T39KMHHMQDnk4jixQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Osmo Pocket 4 against a blue background]]></media:description>                                                            <media:text><![CDATA[DJI Osmo Pocket 4 against a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Osmo Pocket 4 against a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/QD9u6T39KMHHMQDnk4jixQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This is the sort of deal worth pouncing on while it’s live!</p><p>DJI’s Osmo Pocket 4 only turned up in April, and it’s already the little camera every solo creator seems to be raving about. Now AliExpress US has two amazing coupon codes that knock a big chunk off both the standalone camera and the full Creator Combo, and it has free shipping from US warehouses, with buyer protection. No messing about with cross-border shipping or duties. </p><p>We at Tom's Guide already named it the "best all-in-one package” for solo creators, and <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review" target="_blank">one of the best action cameras of 2026</a>, so trust us when we say this is a great deal.</p><p>But here’s the bit you came for: use code <strong>USAFF93</strong> on the <a href="https://aliexpress.sjv.io/c/10132/3916414/22364" target="_blank" rel="nofollow">standard Osmo Pocket 4,</a> and you’ll only pay $575.71. Fancy the full vlogging kit instead? Code <strong>USAFF120</strong> <a href="https://aliexpress.sjv.io/c/10132/3916418/22364" target="_blank" rel="nofollow">brings the Creator Combo</a> (the DJI Mic 3, wide-angle lens, battery handle and tripod) down to $699.05. Both are US-only and are live right through to the end of June. </p><p>These codes are not available on DJI.com, Amazon US, or B&H, so make sure you grab them from here while the deal lasts!</p><h2 id="quick-links">Quick Links</h2><div class="product"><a data-dimension112="c00782b4-4219-4928-a7bc-f8957df6471e" data-action="Deal Block" data-label="Check it out on AliExpress" data-dimension48="Check it out on AliExpress" href="https://aliexpress.sjv.io/c/10132/3916414/22364" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2126px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="3AribytNBs5zZreZAqdDmW" name="Aliexpress logo" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3AribytNBs5zZreZAqdDmW.png" mos="" align="middle" fullscreen="" width="2126" height="2126" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>DJI Osmo Pocket 4 (Standard) for $509.98 using the code <strong>MYFUTURE90</strong>→ <a href="https://aliexpress.sjv.io/c/10132/3916414/22364" target="_blank" rel="nofollow" data-dimension112="c00782b4-4219-4928-a7bc-f8957df6471e" data-action="Deal Block" data-label="Check it out on AliExpress" data-dimension48="Check it out on AliExpress" data-dimension25=""><u>Check it out on AliExpress</u></a></p><p>DJI Osmo Pocket 4 Creator Combo for $635.24 using the code <strong>MYFUTURE120 </strong>→ <a href="https://aliexpress.sjv.io/c/10132/3916418/22364" target="_blank" rel="nofollow"><u>Check it out on AliExpress</u></a></p><p><em>Codes are case-sensitive and single-use per account, US-only, valid June 1 to 30. Ships free from US warehouses in 2 to 5 business days, with the manufacturer's warranty as listed. </em><a class="view-deal button" href="https://aliexpress.sjv.io/c/10132/3916414/22364" target="_blank" rel="nofollow" data-dimension112="c00782b4-4219-4928-a7bc-f8957df6471e" data-action="Deal Block" data-label="Check it out on AliExpress" data-dimension48="Check it out on AliExpress" data-dimension25="">View Deal</a></p></div><h2 id="save-on-the-dji-osmo-pocket-4">Save on the DJI Osmo Pocket 4</h2><div class="product"><a data-dimension112="7a7c6871-6291-46f7-b655-cdb78d132d78" data-action="Deal Block" data-label="DJI Osmo Pocket 4 (Standard) for only $575.71 with code" data-dimension48="DJI Osmo Pocket 4 (Standard) for only $575.71 with code" data-dimension25="$509.98" href="https://aliexpress.sjv.io/c/10132/3916414/22364" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:640px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="8mnn9bPajLA7jxxsnzoU2S" name="dji osmo pocket 4 standalone" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/8mnn9bPajLA7jxxsnzoU2S.png" mos="" align="middle" fullscreen="" width="640" height="640" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><a href="https://aliexpress.sjv.io/c/10132/3916414/22364" target="_blank" rel="nofollow" data-dimension112="7a7c6871-6291-46f7-b655-cdb78d132d78" data-action="Deal Block" data-label="DJI Osmo Pocket 4 (Standard) for only $575.71 with code" data-dimension48="DJI Osmo Pocket 4 (Standard) for only $575.71 with code" data-dimension25="$509.98">DJI Osmo Pocket 4 (Standard) for only $575.71 with code</a> <strong>MYFUTURE90</strong></p><p><a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3" target="_blank" rel="nofollow">The Osmo Pocket 3 was already brilliant</a>, and the <a href="https://aliexpress.sjv.io/c/10132/3916414/22364" target="_blank" rel="nofollow">Pocket 4</a> is a proper glow-up rather than a small token refresh. DJI kept the 1-inch CMOS sensor and that lovely f/2.0 lens, then doubled the slow-mo to 4K/240fps, added 14 stops of dynamic range with 10-bit D-Log (DJI’s flat color profile that leaves you room to grade), and bumped stills to 37MP. <a class="view-deal button" href="https://aliexpress.sjv.io/c/10132/3916414/22364" target="_blank" rel="nofollow" data-dimension112="7a7c6871-6291-46f7-b655-cdb78d132d78" data-action="Deal Block" data-label="DJI Osmo Pocket 4 (Standard) for only $575.71 with code" data-dimension48="DJI Osmo Pocket 4 (Standard) for only $575.71 with code" data-dimension25="$509.98">View Deal</a></p></div><p>That 4K/240fps is the headline, and rightly so. It turns ordinary b-roll into buttery, ten-times slow motion without dropping the resolution to get there. Which brings me to the upgrade I’d genuinely shout about: storage. You get 107GB built in, running at up to 800MB/s, so no more digging through your bag for a microSD at the exact second the shot appears. Of course, 107GB is your max, since there’s no card slot, so multi-day shooters will want to plan around it. But that's a small price to pay, I reckon. </p><p>Wrap in ActiveTrack 7.0 that keeps you locked in frame even when you zoom, the rotatable screen, that new 5D joystick, and roughly 35% less weight than the Pocket 3, a huge difference, making it a doddle to run one-handed all day. </p><p>If you only want the camera, the standard model at only $509.98 with the AliExpress code does the job nicely. </p><h2 id="save-on-the-creator-combo">Save on the Creator Combo</h2><div class="product"><a data-dimension112="6bf282d5-1cd8-4d3b-af2e-632bf2fdc1db" data-action="Deal Block" data-label="The Creator Combo is the one I’d pick up" data-dimension48="The Creator Combo is the one I’d pick up" data-dimension25="$635.24" href="https://aliexpress.sjv.io/c/10132/3916418/22364" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="PaJRf2SrFqjHGXbJQHD9P" name="DJI osmo 4 creator bundle" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PaJRf2SrFqjHGXbJQHD9P.webp" mos="" align="middle" fullscreen="" width="2000" height="2000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>But for vlogging, YouTubing, Journalism, travel or sit-down interviews? <a href="https://aliexpress.sjv.io/c/10132/3916418/22364" target="_blank" rel="nofollow" data-dimension112="6bf282d5-1cd8-4d3b-af2e-632bf2fdc1db" data-action="Deal Block" data-label="The Creator Combo is the one I’d pick up" data-dimension48="The Creator Combo is the one I’d pick up" data-dimension25="$635.24">The Creator Combo is the one I’d pick up</a>, no contest and for $635.24 with code <strong>MYFUTURE120 </strong>its a great deal.</p><p>For only around $125 more than the camera on its own, you bag the DJI Mic 3 (with wireless audio and a built-in mic that levels up your whole set-up), plus the wide-angle lens, battery handle and tripod. <a class="view-deal button" href="https://aliexpress.sjv.io/c/10132/3916418/22364" target="_blank" rel="nofollow" data-dimension112="6bf282d5-1cd8-4d3b-af2e-632bf2fdc1db" data-action="Deal Block" data-label="The Creator Combo is the one I’d pick up" data-dimension48="The Creator Combo is the one I’d pick up" data-dimension25="$635.24">View Deal</a></p></div><p>At $635.24 all in, that’s a proper grab-and-go vlogging kit for under $700, and buying all those parts and putting them together separately would set you back way more. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review" target="_blank">I tested DJI’s new Osmo Pocket 4 — this is the only tool I'll recommend to content creators from now on</a></li><li><a href="https://www.tomsguide.com/audio/dji-mic-3-review-the-gold-standard-for-content-creation" target="_blank">DJI Mic 3 review: The gold standard for content creation</a></li><li><a href="https://www.tomsguide.com/audio/dji-mic-mini-2-review" target="_blank">I’ve been testing the brand-new DJI Mic Mini 2 for three weeks — and it’s the best budget mic for content creators</a></li></ul><p><em>Tom’s Guide may earn a commission when you buy through the links in this article.</em></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test drones for a living and my top-rated quadcopters are on sale for Memorial Day — including a 5-star DJI ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/memorial-day-2026-drone-deals</link>
                                                                            <description>
                            <![CDATA[ There's never a bad time to buy a drone, but this weekend's Memorial Day sales are an excellent time to do so, and I've handpicked the best deals for you. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jCfWGkRyhHWDeGTYviBHCL</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/uUpdwEUNu2GHCSaEyXzu6K-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 23 May 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/uUpdwEUNu2GHCSaEyXzu6K-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Mavic 4 Pro drone]]></media:description>                                                            <media:text><![CDATA[DJI Mavic 4 Pro drone]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Mavic 4 Pro drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/uUpdwEUNu2GHCSaEyXzu6K-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>There's never a bad time to buy a drone — take it from someone who reviews these nifty gadgets for a living. I've spent over 900 hours testing the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a>, and I get very excited anytime my top picks receive price cuts. With <a href="https://www.tomsguide.com/sales-events/memorial-day-sales-2026">Memorial Day deals</a> in full swing, now's a great time to grab a quadcopter for yourself. After all, few things in life are better than capturing the sights from a bird's-eye view.</p><p>Whether you're just a beginner or an experienced pilot, there's a drone for everyone. For example, the <a href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B07FTRYVT5/" target="_blank" rel="nofollow">DJI Neo Fly More Combo is down to just $295 at Amazon</a>, and it comes with extra batteries and a controller. This is an excellent pick for those just starting out. "But what if I've been flying drones for years?" I got you. The <a href="https://www.amazon.com/DJI-Flagship-Tri-Camera-Hasselblad-Transmission/dp/B0DS2GVT2G/" target="_blank" rel="nofollow">DJI Mavic 4 Pro Fly More Combo is available for $2,749 at Amazon</a> — and I gave this drone a 5-star rating!</p><p>Of course, non-DJI drones are on sale too, like the <a href="https://www.amazon.com/Potensic-Drones-Transmission-Vertical-Shooting/dp/B0FSL3XKX3/" target="_blank" rel="nofollow">Potenstic Atom 2 which is down to $519 at Amazon</a>, and the <a href="https://www.amazon.com/Antigravity-Immersive-Beginners-Obstacle-Avoidance/dp/B0G6WRQNQL/" target="_blank" rel="nofollow">Antigravity A1 which is 20% off</a> right now. Here are all the Memorial Day deals that are actually worth your money, handpicked by a registered drone pilot.</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong>DJI Mavic 4 Pro Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Flagship-Tri-Camera-Hasselblad-Transmission/dp/B0DS2GVT2G/" target="_blank" rel="nofollow"><strong>was $2,899 now $2,749</strong></a></li><li><strong>DJI Neo Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B07FTRYVT5/" target="_blank" rel="nofollow"><strong>was $349 now $295</strong></a></li><li><strong>DJI Avata 2 Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Batteries-Immersive-Experience-Acrobatics/dp/B0CS6HVW6P/" target="_blank" rel="nofollow"><strong>was $1,199 now $1,019</strong></a></li><li><strong>Potensic Atom 2 Fly More Combo: </strong><a href="https://www.amazon.com/Potensic-Drones-Transmission-Vertical-Shooting/dp/B0FSL3XKX3/" target="_blank" rel="nofollow"><strong>was $549 now $519</strong></a></li><li><strong>HoverAir X1: </strong><a href="https://www.amazon.com/gp/aw/d/B0CQJTHM5B/" target="_blank" rel="nofollow"><strong>was $339 now $288</strong></a></li><li><strong>Antigravity A1: </strong><a href="https://www.amazon.com/Antigravity-Immersive-Beginners-Obstacle-Avoidance/dp/B0G6WRQNQL/" target="_blank" rel="nofollow"><strong>was $1,599 now $1,279</strong></a></li></ul><h2 class="article-body__section" id="section-best-memorial-day-drone-deals"><span>Best Memorial Day drone deals</span></h2><div class="product"><a data-dimension112="bd4dea12-cb95-464e-8c92-81aefa6b2a2f" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2749" href="https://www.amazon.com/DJI-Flagship-Tri-Camera-Hasselblad-Transmission/dp/B0DS2GVT2G/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:85.70%;"><img id="Kvkti4eq8co7VcNrx6QL6k" name="DJIM4P-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Kvkti4eq8co7VcNrx6QL6k.jpg" mos="" align="middle" fullscreen="" width="1000" height="857" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review" data-dimension112="bd4dea12-cb95-464e-8c92-81aefa6b2a2f" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2749">DJI Mavic 4 Pro</a> improves on its predecessor by introducing 6K/60fps video, 100MP stills powered by a Hasselblad camera, and a brand new RC Pro 2 controller that makes flying a breeze. With a long flight time and 5-star performance across the board, it’s the ideal drone for commercial and personal use.<a class="view-deal button" href="https://www.amazon.com/DJI-Flagship-Tri-Camera-Hasselblad-Transmission/dp/B0DS2GVT2G/" target="_blank" rel="nofollow" data-dimension112="bd4dea12-cb95-464e-8c92-81aefa6b2a2f" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2749">View Deal</a></p></div><div class="product"><a data-dimension112="31a0a427-7099-4f3e-95b6-b17d9ce3509d" data-action="Deal Block" data-label="DJI Neo" data-dimension48="DJI Neo" data-dimension25="$295" href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B07FTRYVT5/" 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="ftPxFuwMzcEkXSjmxkyvDA" name="DJI Neo" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ftPxFuwMzcEkXSjmxkyvDA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A lightweight, compact and minimalistic drone, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review" data-dimension112="31a0a427-7099-4f3e-95b6-b17d9ce3509d" data-action="Deal Block" data-label="DJI Neo" data-dimension48="DJI Neo" data-dimension25="$295">DJI Neo</a> is a fantastic drone that can shoot 4K footage at 30fps, take detailed stills, and remain stable in tricky conditions. Easy to control with the new RC-N3 controller or the DJI Fly app on a smartphone, the Neo makes drone photography more accessible thanks to its low price point.<a class="view-deal button" href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B07FTRYVT5/" target="_blank" rel="nofollow" data-dimension112="31a0a427-7099-4f3e-95b6-b17d9ce3509d" data-action="Deal Block" data-label="DJI Neo" data-dimension48="DJI Neo" data-dimension25="$295">View Deal</a></p></div><div class="product"><a data-dimension112="269ceaca-f912-4b30-97b6-5c597bf263d0" data-action="Deal Block" data-label="DJI Avata 2" data-dimension48="DJI Avata 2" data-dimension25="$1019" href="https://www.amazon.com/DJI-Batteries-Immersive-Experience-Acrobatics/dp/B0CS6HVW6P/" 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:56.07%;"><img id="zF5rpNba3z5QQZ3QjsxNXm" name="61VTNpkhkEL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zF5rpNba3z5QQZ3QjsxNXm.jpg" mos="" align="middle" fullscreen="" width="1500" height="841" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal is for FPV enthusiasts who want an easy-to-navigate drone that can get into tight spaces. The <a href="https://www.tomsguide.com/cameras-photography/drones/i-flew-the-dji-avata-2-for-an-entire-month-heres-what-i-wish-i-knew-beforehand" data-dimension112="269ceaca-f912-4b30-97b6-5c597bf263d0" data-action="Deal Block" data-label="DJI Avata 2" data-dimension48="DJI Avata 2" data-dimension25="$1019">DJI Avata 2</a> is a robust, sturdy drone with propeller guards to protect it when flying close to other objects. It offers greater creative control over how the drone flies which unlocks unique perspectives and dynamic angles that traditional drones can’t achieve.<a class="view-deal button" href="https://www.amazon.com/DJI-Batteries-Immersive-Experience-Acrobatics/dp/B0CS6HVW6P/" target="_blank" rel="nofollow" data-dimension112="269ceaca-f912-4b30-97b6-5c597bf263d0" data-action="Deal Block" data-label="DJI Avata 2" data-dimension48="DJI Avata 2" data-dimension25="$1019">View Deal</a></p></div><div class="product"><a data-dimension112="6fb3d85c-621b-40a9-96ab-0dd66959046f" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$519" href="https://www.amazon.com/Potensic-Drones-Transmission-Vertical-Shooting/dp/B0FSL3XKX3/" 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:78.13%;"><img id="QEqNG4iNnxL2KBjVQKhum8" name="Potensic-Atom-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QEqNG4iNnxL2KBjVQKhum8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1172" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review" data-dimension112="6fb3d85c-621b-40a9-96ab-0dd66959046f" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$519">Potensic Atom 2</a> is a fantastic drone for budget-conscious pilots. It records smooth 4K/30fps video and captures detailed 48MP stills. It features advanced and accurate AI subject tracking, and comes with a new, easy to use controller and app — it’s also lightweight yet sturdy. This drone gives DJI a serious run for its money.<a class="view-deal button" href="https://www.amazon.com/Potensic-Drones-Transmission-Vertical-Shooting/dp/B0FSL3XKX3/" target="_blank" rel="nofollow" data-dimension112="6fb3d85c-621b-40a9-96ab-0dd66959046f" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$519">View Deal</a></p></div><div class="product"><a data-dimension112="bf41109b-a852-4140-89a2-cb8dec3f4cf6" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$288" href="https://www.amazon.com/gp/aw/d/B0CQJTHM5B/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1441px;"><p class="vanilla-image-block" style="padding-top:92.23%;"><img id="DNC8WM5nWsq28ydhTF8jj" name="HoverAir-X1-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/DNC8WM5nWsq28ydhTF8jj.jpg" mos="" align="middle" fullscreen="" width="1441" height="1329" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The HoverAir X1 is a great selfie drone as it can fly without a controller or a smartphone — all you need to do is press the buttons on its body, and it'll record short-form videos. My colleague <a href="https://www.tomsguide.com/features/sorry-dji-this-pocketable-folding-drone-is-the-most-fun-ive-had-flying-in-a-long-time" data-dimension112="bf41109b-a852-4140-89a2-cb8dec3f4cf6" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$288">enjoyed using it a lot</a> and appreciated its surprisingly good obstacle avoidance and subject tracking features such as follow, rocket, and more. This combo includes a storage bag, a charging hub, and a USB cable.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0CQJTHM5B/" target="_blank" rel="nofollow" data-dimension112="bf41109b-a852-4140-89a2-cb8dec3f4cf6" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$288">View Deal</a></p></div><div class="product"><a data-dimension112="6b75fe7a-f420-45fa-932e-12868cf1dacf" data-action="Deal Block" data-label="Antigravity A1" data-dimension48="Antigravity A1" data-dimension25="$1279" href="https://www.amazon.com/Antigravity-Immersive-Beginners-Obstacle-Avoidance/dp/B0G6WRQNQL/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:884px;"><p class="vanilla-image-block" style="padding-top:70.81%;"><img id="NGdR9g2gcxuLzKBw6dG9Nh" name="Antigravity-A1-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NGdR9g2gcxuLzKBw6dG9Nh.jpg" mos="" align="middle" fullscreen="" width="884" height="626" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review" data-dimension112="6b75fe7a-f420-45fa-932e-12868cf1dacf" data-action="Deal Block" data-label="Antigravity A1" data-dimension48="Antigravity A1" data-dimension25="$1279">Antigravity A1</a> is fitted with tech you’ll find in the Insta360's action and 360° cameras, and it lets you capture every angle possible. Footage is shot in 8K/30fps, enabling you to maintain 4K in 16x9 when reframing in post — and this footage is packed with detail. 55MP stills look great too. Flying the drone is easy (and immersive) with the Vision goggles and Grip controller.<a class="view-deal button" href="https://www.amazon.com/Antigravity-Immersive-Beginners-Obstacle-Avoidance/dp/B0G6WRQNQL/" target="_blank" rel="nofollow" data-dimension112="6b75fe7a-f420-45fa-932e-12868cf1dacf" data-action="Deal Block" data-label="Antigravity A1" data-dimension48="Antigravity A1" data-dimension25="$1279">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Ww1LaX"></div>                            </div>                            <script src="https://kwizly.com/embed/Ww1LaX.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/cameras-photography/drones/i-test-drones-for-a-living-heres-what-i-think-of-reddits-top-recommendations-for-beginners">I test drones for a living — here’s what I think of Reddit’s top recommendations for beginners</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">I’ve spent over 900 hours testing all the best drones: here are my top picks</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best Picks</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/my-top-rated-drones-for-the-summer">Summer is the best time for aerial photography — here are my top-rated drones for the perfect shots</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI Mic Mini 2 review: The best affordable mic for content creators ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/dji-mic-mini-2-review</link>
                                                                            <description>
                            <![CDATA[ DJI Mic Mini 2 is the best budget wireless microphone for content creators, and there’s no competition. It’s straightforward and has premium sound quality. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">XfhEQTdzsFfGwQThHRsBCG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DmJo26x43XoritjyTPeSXo-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 22 May 2026 08:33:57 +0000</pubDate>                                                                                                                                <updated>Fri, 03 Jul 2026 12:43:14 +0000</updated>
                                                                                                                                            <category><![CDATA[Audio]]></category>
                                                                                                <author><![CDATA[ erin.bashford@futurenet.com (Erin Bashford) ]]></author>                    <dc:creator><![CDATA[ Erin Bashford ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/rLvJvJVZx43hEzSsJy3BpL.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Erin Bashford is a senior reviews writer at Tom’s Guide. She has a Master’s in Broadcast and Digital Journalism from the University of East Anglia and 7 years of experience reviewing music and events for various publications. She has edited publications such as Outline Magazine’s Guide to Norwich, and she has written for a number of music magazines and websites such as Clash Magazine, Outline Magazine and Dork Magazine. She has a strong interest in audio gear and the music world. &lt;/p&gt;&lt;p&gt;As an ex-barista, Erin is passionate about coffee tech. She also loves finding the best cooking hacks and kitchen appliances, including her beloved Instant Pot. &lt;/p&gt;&lt;p&gt;In her spare time, you can find her reading, practising yoga, hiking, writing fantasy novels, or stressing over NYT Games.&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/DmJo26x43XoritjyTPeSXo-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom&#039;s guide background]]></media:description>                                                            <media:text><![CDATA[the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom&#039;s guide background]]></media:text>
                                <media:title type="plain"><![CDATA[the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom&#039;s guide background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DmJo26x43XoritjyTPeSXo-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The DJI Mic Mini 2 is, without a doubt, the <a href="https://www.tomsguide.com/best-picks/best-microphones">best microphone</a> for content creators on a budget. Building from the Mic Mini’s already impressive roster of specs, the Mic Mini 2 now has vocal tones — <em>à la</em> Shure — swappable colorful body plates, and the RX now has backwards compatibility, meaning you can connect older DJI TXs. It’s just not compatible with 2022’s DJI Mic.</p><p>Of course, you still get pro-level sound quality, with clarity across plosive and sibilant words, and a rich, warm profile (which you can make even warmer with the “Rich” vocal tone). On top of being pro-quality at a decidedly budget price, the Mic Mini 2 comes with either a smartphone USB-C RX or the traditional camera RX. </p><p>This level of versatility, not to mention its sublime ease of use, makes the DJI Mic Mini 2 super easy to recommend. I can’t imagine my content without this mic now — and I don’t think you’ll regret getting this mic, either. To find out why I gave this mic a 5-star rating, keep reading this DJI Mic Mini 2 review. </p><h2 class="article-body__section" id="section-dji-mic-mini-2-review-specs"><span>DJI Mic Mini 2 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p><a href="https://www.amazon.co.uk/DJI-Bluetooth-Microphone-Cancelling-Multi-Color/dp/B0G39G3SZM" target="_blank" rel="nofollow">From £49</a></p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>USB-C, 3.5mm TRS, Bluetooth, DJI ecosystem</p></td></tr><tr><td class="firstcol " ><p><strong>Max SPL</strong></p></td><td  ><p>120 dB</p></td></tr><tr><td class="firstcol " ><p><strong>Max resolution / sample rate</strong></p></td><td  ><p>48kHz / 24-bit</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20 Hz - 20 kHz</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone type</strong></p></td><td  ><p> Wireless omnidirectional </p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>48 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>11g (transmitter)</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>1.1 x 1.1 x 0.5 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Various, I tested transparent gray</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-mic-mini-2-review-price-availability"><span>DJI Mic Mini 2 review: Price & availability </span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rzSgvSsTEddxzezGGjBCE" name="DJI_MIC_Mini_2 11.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/rzSgvSsTEddxzezGGjBCE.jpg" mos="" align="middle" fullscreen="" width="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 Mic Mini 2 is available in three styles: Transmitter (TX) only (if you already have a receiver for your recording device), smartphone creator, or standard creator. I tested the 1-TX smartphone creator, which comes with one microphone and one USB-C receiver (RX). </p><p>The prices vary according to how many TX units you get, but <a href="https://www.amazon.co.uk/DJI-Bluetooth-Microphone-Cancelling-Multi-Color/dp/B0G39G3SZM" target="_blank" rel="nofollow">one TX + USB-C RX would be £49</a>, and <a href="https://www.amazon.co.uk/DJI-Bluetooth-Microphone-Cancelling-Multi-Color/dp/B0G39FV1HL" target="_blank" rel="nofollow">two TX + USB-C RX would be £69 from Amazon</a>. The <a href="https://www.amazon.co.uk/DJI-Bluetooth-Microphone-Cancelling-Multi-Color/dp/B0G39C97WQ" target="_blank" rel="nofollow">standard creator package with two TX and a standard RX </a>(for cameras and phones) is £89. </p><p>This is almost incomprehensibly cheap for a microphone of this caliber. The previous model, <a href="https://www.tomsguide.com/audio/dji-mic-mini-review">Mic Mini</a>, is £65, so there’s been a price increase of £20, but I really don’t mind considering the improvements. The <a href="https://www.tomsguide.com/audio/dji-mic-3-review-the-gold-standard-for-content-creation">DJI Mic 3</a> was recently released for a max of $329/£259, but I would reserve recommending this only for videographers or pros. The Mic Mini series is for content creators or newbies. </p><p>I’ve also tested the $139/£129 <a href="https://www.tomsguide.com/audio/rode-wireless-micro-review">Rode Wireless Micro</a>, and  I now use the <a href="https://www.tomsguide.com/reviews/dji-mic-2">DJI Mic 2</a> in The Coffee Lab, my TikTok/Instagram series. </p><p>I think you’d be happy with any of these aforementioned mics, but if you’re on a budget, it’s got to be the £49 Mic Mini 2. You can<em>not</em> tell how cheap this mic is by listening to it. </p><h2 id="availability">Availability</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bWPeEgkpg757DqanghinXo" name="DJI_MIC_Mini_2 6.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/bWPeEgkpg757DqanghinXo.jpg" mos="" align="middle" fullscreen="" width="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>All that being said, it’s not all sunshine and rainbows in DJI land. You might have noticed a glaring omission in the pricing information above. In light of the <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">U.S. government’s ongoing drone-related feud with DJI</a>, the Mic Mini 2 is not available in the U.S., and will not be available in the U.S. at all. </p><p>From DJI’s spokesperson:<em> “We do not have US pricing. The DJI Mic Mini 2 will not be available in the US market as the application for authorization is still pending.”</em></p><h2 class="article-body__section" id="section-dji-mic-mini-2-review-design-controls"><span>DJI Mic Mini 2 review: Design & controls</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Hsyd7yHGVsggEi6rLzLUWo" name="DJI_MIC_Mini_2 5.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/Hsyd7yHGVsggEi6rLzLUWo.jpg" mos="" align="middle" fullscreen="" width="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 Mic Mini 2 has a utilitarian design, which I personally love. It’s relatively inconspicuous while also boasting the DJI logo for those social media “I’m a content creator who knows what I’m doing” points. </p><p>The USB-C receiver is transparent — a major noughties vibe if you ask me — and beyond easy to use. It has two buttons: one for pairing, one slider for on-mic ambient noise reduction. Simply slide the slider to turn ambient noise reduction on or off. This is great, as it means you won’t have to fiddle with apps during interviews or content creation sessions. </p><p>The TX itself is also transparent, which I personally love. You can get covers in orange, green, pink, and basically every color of the rainbow. On top of this, you can get a pack of multi-colored windscreens/dead cats for an extra £20. </p><p>I’m happy to see this degree of personalization — now you can have the same mic as every other content creator (because it’s that good) but still make it your own. </p><h2 id="charging-case">Charging case</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QYCh2oVAQgxMD5dyDoPTYo" name="DJI_MIC_Mini_2 7.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/QYCh2oVAQgxMD5dyDoPTYo.jpg" mos="" align="middle" fullscreen="" width="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 charging case size will depend on the model you purchase, but mine was relatively compact — just double the size of my <a href="https://www.tomsguide.com/audio/airpods/apple-airpods-pro-3-review">AirPods Pro 3</a> case. I was able to throw the mic in my bag for on-the-go content creation without needing to rearrange my suitcase. </p><p>I could also fit the windscreen/dead cat in the charging case alongside the RX and TX — another major plus for on-the-go usage. </p><h2 id="controls">Controls</h2><p>As touched on above, the DJI Mic Mini 2 is <em>beyond</em> easy to use. There are buttons on the TX and RX, but I rarely had to use these. The mic always automatically connected to the RX, and the RX always automatically transmitted to my phone camera. I didn’t have to do anything. </p><p>If you’re a complete mic newbie, you will not be disappointed or frustrated with the Mic Mini 2. It has seriously changed my content for the better. </p><h2 class="article-body__section" id="section-dji-mic-mini-2-review-features-connectivity"><span>DJI Mic Mini 2 review: Features & connectivity</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7LEyTUrKq4s54SALbWLb" name="DJI_MIC_Mini_2 4.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/7LEyTUrKq4s54SALbWLb.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As this is a £49-£89 mic, it’s not as feature-heavy as the DJI Mic 3. The Mic 3 has a touchscreen on the RX and chunkier TXs, onboard storage, timecode sync, and handles up to four mics on one receiver. You won’t find any of this on the Mic Mini 2. </p><p>But that’s not to say the Mic Mini 2 is featureless, because that’s far from the truth. </p><p>As with the Mic 3, the Mic Mini 2 can link with DJI devices like the <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review">DJI Osmo Pocket 4</a> and <a href="https://www.tomsguide.com/cameras-photography/ive-been-testing-the-dji-osmo-pocket-3-and-its-easily-my-new-favorite-camera">Osmo Pocket 3</a> without a receiver. It’ll also hook up to the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review">DJI Osmo Action 5 Pro</a> or <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-6-review">DJI Osmo Action 6</a> wirelessly, too. This works via DJI’s proprietary OsmoAudio — which is essentially just Bluetooth, making it fine for vlogging but poor for loud environments and wide audio dynamic ranges, where you’ll want to hook up via the RX for higher recording quality. </p><p>You can also connect to any phone without a receiver using standard Bluetooth. I used the RX with my <a href="https://www.tomsguide.com/phones/iphones/apple-iphone-16-pro-review">iPhone 16 Pro</a> for all content.</p><p>The Mic Mini 2 also records a safety track: one at normal volume, one 6dB quieter to prevent clipping. It also has vocal tone modes to make your voice sound deeper, should you so desire, which I’ll go into more detail about below. </p><p>If you want a more professional-feeling mic, I’d recommend checking out the $329 <a href="https://www.tomsguide.com/audio/microphones/rode-wireless-go-gen-3-review">Rode Wireless Go Gen 3</a> or the $399 Rode Wireless Pro, which we used in our <a href="https://www.tomsguide.com/home/home-appliances/ultenic-u12-vesla-cordless-vacuum-review#section-ultenic-u12-vesla-review-cheat-sheet">Buy or Skip videos</a>. Both of these models have 32-bit float onboard storage (up to 40 hours), and the Pro has premium features like a timecode generator.</p><h2 id="app">App</h2><p>The DJI Mic Mini 2 uses the DJI Mimo app, which is relatively straightforward to use. You can update firmware, add voiceovers, and import audio clips for videos recorded on DJI cameras. If you shoot on DJI cameras or use the built-in editing software, it’s an essential. However, if you predominantly film with your phone, I’m not sure you’ll need it. Actually, I was using it without the app for weeks before I downloaded it, and I don’t think I missed out on much — but that could be because I record on my phone. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1600px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KNwTsA6ebLu5NBab5erhw4" name="dji mic mini 2 app" alt="the DJI Mic mini 2 mimo app" src="https://cdn.mos.cms.futurecdn.net/KNwTsA6ebLu5NBab5erhw4.png" mos="" align="middle" fullscreen="" width="1600" height="900" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DJI / Future)</span></figcaption></figure><p>As you can cycle through noise reduction modes on the receiver itself, you don’t need to use the app to select this or configure any settings.</p><p>You get much more in the DJI app than Rode’s app, so if you’re the kind of person who loves a companion app, I’d recommend the Mic Mini 2 over the Rode Wireless Micro. </p><h2 class="article-body__section" id="section-dji-mic-mini-2-review-audio-quality"><span>DJI Mic Mini 2 review: Audio quality</span></h2><p>For just $49 (the combo I tested), I could <em>not</em> believe the sound quality. I’ve tested pretty much every mic brand under the sun, and, for me, Shure always comes out on top — but the DJI Mic Mini 2 is a fantastic budget option if Shure is a little out of reach. </p><p>I use the DJI Mic Mini 2 for my Instagram content, which you can watch here. </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/DYXhzsnNgje/" target="_blank">DJI Mic Mini 2 sample video</a></p><p>A photo posted by  on </p></blockquote></div><p>Did you hear that sound quality? It’s faithful, rich, warm, and while there’s a <em>little</em> popping, this is nowhere near bad enough for me to knock stars off. Perfecting microphone etiquette will help reduce popping, so that’s something I need to work on. </p><p>As usual, though, I put the DJI Mic Mini 2 through our standardized audio tests, which I’ll get into now. </p><h2 id="standardized-audio-testing">Standardized audio testing</h2><p>To test the quality of the Mic Mini 2, I put the microphone through its paces with plosives, fricatives/sibilance, and ambient noise reduction. This is with the windscreen/dead cat attached.</p><h2 id="plosives">Plosives</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9R4DnyszBBykuJunToDo5" name="DJI_MIC_Mini_2 10.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/9R4DnyszBBykuJunToDo5.jpg" mos="" align="middle" fullscreen="" width="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>To test plosives, I recited some tongue twisters. This is me being <em>really</em> forceful with the air and really trying to make popping sounds. If you have decent microphone etiquette, yours won’t be as bad as this. Again — watch the embedded Instagram video if you want a real-life usage. </p><audio src="https://cdn.mos.cms.futurecdn.net/cBN3EidyCtjRBPk9bWjxWE/dji%20mic%20mini%202%20plosives.mp3"  controls="controls" preload="none"></audio><p><br>As you can hear, there are quite a few pronounced pops. However, this didn’t clip the recording. As long as you know how to speak into a microphone, you should be fine. I never experienced majorly off-putting pops in my real-life usage. </p><h2 id="fricatives-sibilance">Fricatives/sibilance </h2><p>Take a listen to this MP3. </p><audio src="https://cdn.mos.cms.futurecdn.net/rEKHtkLrC48zfWWSDBxGYE/dji%20mic%20mini%202%20sibilance.mp3"  controls="controls" preload="none"></audio><p><br>I was super surprised by how adeptly the Mic Mini 2 handled hissing sounds. Again, I was really trying to enunciate all that sibilance, so I was genuinely impressed here. You don’t even have to know microphone etiquette for the Mic Mini 2 to make you sound good!</p><h2 id="ambient-noise-reduction">Ambient noise reduction</h2><p>For this test, I recorded two clips. One with noise reduction set to High, one with noise reduction turned off. </p><p>This is with noise reduction on <strong>high</strong>. </p><audio src="https://cdn.mos.cms.futurecdn.net/xUYmT6899PagZhnYRLoMWE/dji%20mic%20mini%202%20ambient%20noise%20reduction%20ON.mp3"  controls="controls" preload="none"></audio><p><br>I sound a little underwater, but in general, this is majorly impressive for a £49-£89 mic. You can’t hear much of the ambient noise track — in real life, it was seriously loud. I’d recommend using the Mic Mini 2 in loud places like city interviews without a worry. </p><p>This is with noise reduction <strong>off</strong>. </p><audio src="https://cdn.mos.cms.futurecdn.net/5W9kXE9ACms2NNgAGpUYXE/dji%20mic%20mini%202%20ambient%20noise%20reduction%20OFF.mp3"  controls="controls" preload="none"></audio><p><br>Even with noise reduction off, I was really impressed with this performance. Seriously, the DJI Mic Mini 2 feels like my forever mic now. I don’t think anyone would be disappointed with this budget beast.  </p><h2 id="extra-features">Extra features</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CMfDzKHsT3NTPEFqqx8KNo" name="DJI_MIC_Mini_2 1.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/CMfDzKHsT3NTPEFqqx8KNo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As touched on above, the DJI Mic Mini 2 has two (three, kind of) vocal tones in the Mimo app. You can choose between Rich, Bright, or Normal. Take a listen to my voice clips below. </p><p>This is with <strong>Rich</strong>. </p><audio src="https://cdn.mos.cms.futurecdn.net/2NMhuZkm7DLh4W9w4gekVE/dji%20mic%20mini%202%20rich.mp3"  controls="controls" preload="none"></audio><p><br>I think my voice actually does sound deeper. It enhances the lower range of my voice, which gives me that broadcast-like sound, but there is a little fuzziness not present without the tone.</p><p>This is with <strong>Bright</strong>. </p><audio src="https://cdn.mos.cms.futurecdn.net/JxrvSmzB2FNBHCJrAa6xVE/dji%20mic%20mini%202%20bright.mp3"  controls="controls" preload="none"></audio><p><br>I really don’t think this suits my voice — it makes me sound a little pinchy. This would be if you want to make your voice sound more energetic and fresh. </p><p>This is with no vocal tones.</p><audio src="https://cdn.mos.cms.futurecdn.net/7YqnFNwivFoJVwUZ4t99XE/dji%20mic%20mini%202%20no%20vocal%20tones.mp3"  controls="controls" preload="none"></audio><p><br>As you can hear, my voice is still audible and clear in all three of these clips — it’s just your preference. I think I like my voice unfiltered, though. </p><h2 class="article-body__section" id="section-dji-mic-mini-2-review-battery-life"><span>DJI Mic Mini 2 review: Battery life</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4noi48YVivThnALNgnbFLo" name="DJI_MIC_Mini_2 2.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/4noi48YVivThnALNgnbFLo.jpg" mos="" align="middle" fullscreen="" width="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 fully charged case, the Mic Mini 2 can provide up to forty-eight hours of battery life. Let me just put it this way: I’ve been using the Mic Mini 2 for four weeks, and I’ve only had to charge it once — I post about five videos a week. I never have to think about charging the Mic Mini 2, which is such a relief when I’m thinking about everything else that comes with content creation! </p><p>This is so much better than the Sennheiser Profile Wireless, which is intended to last seven hours, but I found myself needing to recharge it every couple of days (despite only using it for maybe two hours). </p><h2 class="article-body__section" id="section-dji-mic-mini-2-review-verdict"><span>DJI Mic Mini 2 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="m4jE7kBR66T768w9dq35Ko" name="DJI_MIC_Mini_2 9.JPG" alt="the dji mic mini 2 for camera and smartphone conent creators photographed against the blue tom's guide background" src="https://cdn.mos.cms.futurecdn.net/m4jE7kBR66T768w9dq35Ko.jpg" mos="" align="middle" fullscreen="" width="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 DJI Mic Mini 2 is my perfect microphone. It’s plug-and-play, works without a companion app, sounds great, looks great, and is just £49-£89. I seriously don’t know what else I could ask for. </p><p>I hope the 5-star rating speaks for itself, but if you still need a little persuading, let me try my best. I use this mic for my Instagram page, it’s ready to record in seconds after plugging into my phone, and I can record directly into my camera or into Instagram. There’s never any audio sync issues, my voice is always clear, and it wouldn’t set me back $$$. This is the cheapest, quickest way to hack pro-level video at an amateur-level price. </p><p>I’m going to use the DJI Mic Mini 2 for the rest of eternity (or until it breaks, of course). This is the best affordable mic for mobile content creators, and it’s not even close. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the DJI RS 5 — and it's a super charged gimbal that content creators will love ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/dji-rs-5-gimbal-review</link>
                                                                            <description>
                            <![CDATA[ With its faster setup and integrated tracking, the DJI RS5 is the best gimbal for mirrorless cameras. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">54t8Cj5sgV2CrioyoL8s9P</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/YisQtfeeNeNTdoSHrN7xjR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 09 May 2026 09:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ Paul.antill@futurenet.com (Paul Antill) ]]></author>                    <dc:creator><![CDATA[ Paul Antill ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/7MyNkF6oJfDnS9kZG658oC.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Paul Antill is a Video Producer and Content Creator at Tom&#039;s Guide, specializing in video/audio recording, smart home technology, and laptops. His passion lies in making tech coverage not just informative but also fun and accessible to everyone answering the question “Why does this new product or feature matter to me?” Paul has been a tech host and video producer since 2019 where he has also covered major tech and gaming events. His love for tech and video began on his&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/@paulAntill&quot;&gt;&lt;strong&gt;YouTube channel&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; &lt;/strong&gt;where for the low price of one subscription he shares head-to-head comparisons and clever ways to make the most of your gear. You can also see the behind-the-scenes and the magic that goes into our Tom’s Guide videos over on his&amp;nbsp;&lt;a href=&quot;https://www.instagram.com/thepaulantill/&quot;&gt;&lt;strong&gt;Instagram&lt;/strong&gt;&lt;/a&gt;. Paul graduated from the Mason School of Business at William &amp;amp; Mary, Williamsburg, VA, with a degree in Marketing and Business Analytics. When he&#039;s not on camera, you’ll probably still spot him behind one doing street photography and videography. Back home he’s probably in a heated Overwatch 2 match with his friends.&amp;nbsp;&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/YisQtfeeNeNTdoSHrN7xjR-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI RS 5]]></media:description>                                                            <media:text><![CDATA[DJI RS 5]]></media:text>
                                <media:title type="plain"><![CDATA[DJI RS 5]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/YisQtfeeNeNTdoSHrN7xjR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Last year, I fell in love with the <a href="https://www.tomsguide.com/cameras-photography/dji-rs-4-mini-review-the-hands-free-gimbal-youve-been-waiting-for">DJI RS 4 Mini </a>because of its balance of portability and features, including a newly introduced magnetic tracking module which allowed for hands-free recording. The downside? Its lower payload limited it to smaller camera and lens combos, and its tracker, as handy as it was for recording myself, could only recognize and follow humans. Enter the DJI RS 5.</p><p>In addition to its higher 6.6lbs payload which better supports more professional camera setups like my <a href="https://www.tomsguide.com/cameras-photography/mirrorless-cameras/i-tested-the-panasonic-lumix-s1r-ii-and-its-almost-the-perfect-hybrid-camera">Panasonic Lumix S1R II</a> as well as larger zoom lenses, the new RS 5 also takes the Mini's once exclusive tracking features and "supercharges" them with better recognition that can now follow vehicles and other inanimate objects. Those two upgrades alone have made the RS 5 a now crucial part of my video production.</p><p>Combine that with the RS 5's significantly improved balancing, which is the best I've ever tested, as well as faster charging which gets you from 0-100% in just an hour, and this is the ultimate gimbal for those with medium-to-large camera setups, especially for solo creators.</p><h2 class="article-body__section" id="section-dji-rs-5-review-specs"><span>DJI RS 5 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>Starts at <a href="https://a.co/d/0hle2zC4" target="_blank" rel="nofollow">$569</a> / <a href="https://www.amazon.co.uk/DJI-Stabilizer-Panasonic-Fine-Tuning-Quick-Open/dp/B0FLKBCT26/" target="_blank" rel="nofollow">£485</a></p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>2.3lbs (Gimbal only)</p></td></tr><tr><td class="firstcol " ><p><strong>Max payload</strong></p></td><td  ><p>6.6lbs</p></td></tr><tr><td class="firstcol " ><p><strong>Axis locks</strong></p></td><td  ><p>Automated (Gen 2)</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>1.8-inch OLED Touchscreen</p></td></tr><tr><td class="firstcol " ><p><strong>Vertical shooting</strong></p></td><td  ><p>Native (Gen 2 Vertical Mount)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>14 hours (fast charge in 1 hour)</p></td></tr><tr><td class="firstcol " ><p><strong>Tracking</strong></p></td><td  ><p>Enhanced Intelligent Tracking Module</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-rs-5-review-price-availability"><span>DJI RS 5 review: Price & availability</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:8217px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Teer3oyKvCpghBeqVDqowC" name="DJI RS 5 against a blue background" alt="DJI RS 5 against a blue background" src="https://cdn.mos.cms.futurecdn.net/Teer3oyKvCpghBeqVDqowC.jpg" mos="" align="middle" fullscreen="" width="8217" height="4623" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The £549 DJI Osmo Pocket 4 Creator Combo, with all components packed into the included carry case. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Paul Antill / Tom's Guide)</span></figcaption></figure><p>The DJI RS 5 is available in two main configurations. The standalone gimbal with the battery grip and quick open tripod foot for <a href="https://a.co/d/0hle2zC4" target="_blank" rel="nofollow">$549</a> / <a href="https://www.amazon.co.uk/DJI-Stabilizer-Panasonic-Fine-Tuning-Quick-Open/dp/B0FLKBCT26/" target="_blank" rel="nofollow">£485</a>, while the Combo, which I'm testing, adds the electronic briefcase handle and the Enhanced Intelligent Tracking Module for <a href="https://www.amazon.com/DJI-Stabilizer-Intelligent-Electronic-Fine-Tuning/dp/B0FLKB8TB5/" target="_blank" rel="nofollow">$749</a> /<a href="https://www.amazon.co.uk/DJI-Stabilizer-Intelligent-Electronic-Fine-Tuning/dp/B0FLKB8TB5/" target="_blank" rel="nofollow"> £619</a>. Optionally, you can also purchase the DJI RS Enhanced Intelligent Tracking Module separately for $99 if you don't need the handle or want to pick up the tracker down the road.</p><p>At the time of this review, an RS 5 Pro model is not available with no release date — if any — in sight. DJI tends to space out their releases which means for now at least if you need a gimbal that can support up to 10lbs,  you'll need to go with last year's RS 4 Pro.</p><p>While DJI continues to face U.S. government bans on its cameras, <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">drones</a>, and other new products, the RS 5 is available at most major retailers, although no first-party availability through DJI’s website means no aftercare plans. It'll be interesting to see how these tensions impact DJI's future releases but for now, their gimbal lineup doesn't seem to be as impacted. </p><h2 class="article-body__section" id="section-dji-rs-5-review-setup-balancing"><span>DJI RS 5 review: Setup & balancing</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3TQbJ6vkfN6QNgsXjkEbZR" name="DJI RS 5 - With Lumix S1Rii & 18mm Lens" alt="DJI RS 5 with Lumix S1Rii & 18mm Lens" src="https://cdn.mos.cms.futurecdn.net/3TQbJ6vkfN6QNgsXjkEbZR.jpg" mos="" align="middle" fullscreen="" width="1840" height="1035" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Paul Antill / Tom's Guide)</span></figcaption></figure><p>While DJI’s gimbal design has remained largely unchanged over the last few years, each new model brings refinements to ergonomics, usually shaves off a bit of weight, and improves efficiency. The RS 5 is no exception as it looks and feels nearly identical to last year's DJI RS 4, including the same automated axis locks that let the gimbal automatically fold and unfold itself in one click. However, the RS 5 has a number of less obvious but much appreciated upgrades.</p><p>Balancing gimbals has always been my least favorite part. Back in my days as a wedding videographer, I would have to strategically find the best time to swap out lenses. Up until now, it was a constant slide-back-and-forth situation where you’d nudge the arm and try not to overshoot the balance point — which was especially difficult with heavier cameras attached.</p><p>While the RS 4 had a fine-tuning knob for its rail adjustment, the RS 5 takes things further by adding them to all three axes, using a leadscrew mechanism for millimeter-level precision with a few quick turns rather than the push-and-pull struggle from before. In my testing, this made a massive difference. Switching from a light and short 35mm prime lens to a much longer and heavier 24-60 zoom lens took about 10 seconds rather than 1-2 minutes. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Kgkq73uYN4KGv3Ka4eVSrQ.jpg" alt="DJI RS 5 Axis Knobs" /><figcaption><small role="credit">Paul Antill / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/yMBD6SuTwkwZmQCEo4zSnA.jpg" alt="DJI RS 5 Axis Knobs" /><figcaption><small role="credit">Paul Antill / Tom's Guide</small></figcaption></figure></figure><p>DJI also added a new on screen Z‑Axis Indicator that gives you instant feedback to your setup's balance as you move around to help you adjust your movements for steadier shots. Another small but still cool upgrade is found in its tripod foot which now opens all three feet at the same time instead of the usual one at a time. It's another thing that shaves off time and makes the RS 5 the fastest gimbal to setup that I've ever tested.</p><p>For heavier camera setups or low-angle shots, the electronic briefcase handle which comes with the RS 5 Combo can help distribute the weight between your two handles more easily. Unlike previous bundled handles, this one features a joystick and buttons that can control the gimbal and camera from a more convenient position. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2UjMuEWPh6thrABYWZq4sf" name="DJI RS 5 - Z Axis" alt="DJI RS 5 Z Axis balance on screen tool" src="https://cdn.mos.cms.futurecdn.net/2UjMuEWPh6thrABYWZq4sf.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Paul Antill / Tom's Guide)</span></figcaption></figure><p>Just like its predecessor, the RS 5 is rated for 6.6lbs, though DJI claims it offers 50% more motor torque for added stability, especially when doing fast "follow" movements or low-angle shots which tend to put more stress on the gimbal. For most full size <a href="https://www.tomsguide.com/us/best-mirrorless-cameras,review-2221.html">mirrorless camera</a> combos, this continues to be the sweet spot. </p><p>But despite these upgrades, DJI has put itself in a very awkward spot right now. For anyone looking for a lighter gimbal to support their smaller APS-C or Micro Four Thirds cameras, they're probably best getting last year's DJI RS 4 Mini, and for higher payloads, they'll need to go with last year's RS 4 Pro. </p><h2 class="article-body__section" id="section-dji-rs-5-review-battery-life"><span>DJI RS 5 review: Battery life</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UaKDYKRbqqJuS5oDDt4Qdj" name="DJI RS 5 Front view" alt="DJI RS 5 Front view" src="https://cdn.mos.cms.futurecdn.net/UaKDYKRbqqJuS5oDDt4Qdj.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Paul Antill / Tom's Guide)</span></figcaption></figure><p>The DJI RS 5 gets a slight boost to battery life, now rated for 14-hours. The battery grip is still removable if you wanted to swap in a fresh set. More impressive, though, are significantly faster charging speeds. Last year, the RS 4 took about two and a half hours to fully charge while the RS 5 cuts that down to just one hour. A quick 15-minute charge between shots could get me a few extra hours of run time. </p><h2 class="article-body__section" id="section-dji-rs-5-review-improved-tracking"><span>DJI RS 5 review: Improved tracking</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="n5HSonsuSw8qBucFrbadNP" name="DJI RS 5 - Tracking Module" alt="DJI RS 5 Tracking Module" src="https://cdn.mos.cms.futurecdn.net/n5HSonsuSw8qBucFrbadNP.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Paul Antill / Tom's Guide)</span></figcaption></figure><p>Saving my favorite feature for last, the new RS Enhanced Intelligent Tracking Module has transformed how I use the DJI RS 5. Previously I relied on the DJI RavenEye accessory, which required an HDMI feed and USB-C connection from the camera that was clunky and worked about half of the time (if I was lucky).</p><p>When DJI first introduced their revamped tracking camera module with the RS 4 Mini, which attached magnetically and communicated directly with the gimbal and displayed a live feed right on the touchscreen without any additional setup: I was impressed. But as I mentioned earlier, I was a bit underwhelmed that tracking was limited to human subjects only.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dDWg4cFURCAwyxBENeuqpk" name="DJI RS 4 Mini - Tracking Module" alt="DJI RS 4 Mini Tracking Module" src="https://cdn.mos.cms.futurecdn.net/dDWg4cFURCAwyxBENeuqpk.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Paul Antill / Tom's Guide)</span></figcaption></figure><p>Don't get me wrong: as a solo creator, the gesture controls are still a lifesaver. An open palm tells the gimbal to start tracking me, indicated by the tracker ring light turning green. When I want it to stop, I make another open palm and light turns red. When my camera is paired, a peace sign starts or stops recording and a "Double L" gesture even lets me pause tracking to reposition myself and then resume after I've moved. </p><p>Now, the RS 5 takes that foundation and makes it significantly more valuable by introducing non-human tracking as well. The tracker can now lock onto almost anything, whether it is a building in the distance, a car driving by, or a stationary product on my desk. This allows for much easier capture of smooth, cinematic movements because you can focus more on the gimbal movement itself and less on keeping your subject in frame. </p><p>One trick I really like to do is combo this with a camera slider, even a "dumb" one that just slides back and forth on a loop. On the gimbal touchscreen, I simply draw a box on the subject I want to track, usually another product I am reviewing, and the gimbal stays perfectly locked on as it moves along the rail. It creates high-end production value with minimal effort which is always what I'm trying to achieve at the end of the day. Whether you get it as part of the Creator Combo or as a separate $99 add-on, I think its a no-brainer accessory if you want to get the most out of the RS 5.</p><h2 class="article-body__section" id="section-dji-rs-5-review-verdict"><span>DJI RS 5 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZgjpyGa9TvmjiT4xp6pjUZ" name="DJI RS 5 - Side view" alt="DJI RS 5 in hand" src="https://cdn.mos.cms.futurecdn.net/ZgjpyGa9TvmjiT4xp6pjUZ.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Paul Antill / Tom's Guide)</span></figcaption></figure><p>If you are looking for the ultimate gimbal for a medium sized camera setup, DJI raises the bar once again with the RS 5. By combining improved efficiency, speed and smart tracking features, DJI has created one of the best tools for solo camera operators. The improved balancing system alone could justify the upgrade for many. It'll be interesting to see if and when DJI releases an updated Mini and Pro gimbal, but right now, this is the most well-rounded gimbal you can get today. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI Mic 3 review: The gold standard for content creation ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/audio/dji-mic-3-review-the-gold-standard-for-content-creation</link>
                                                                            <description>
                            <![CDATA[ Despite a few flaws, the DJI Mic 3 is the ideal microphone for content creators, especially those shooting with DJI gear. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CispqSgStooeTXEEcvh6xb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DcQeMCgBMZ6kndj6qhdwCK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Apr 2026 12:43:47 +0000</pubDate>                                                                                                                                <updated>Tue, 09 Jun 2026 10:32:32 +0000</updated>
                                                                                                                                            <category><![CDATA[Audio]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DcQeMCgBMZ6kndj6qhdwCK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The DJI Mic 3 clipped to a shirt]]></media:description>                                                            <media:text><![CDATA[The DJI Mic 3 clipped to a shirt]]></media:text>
                                <media:title type="plain"><![CDATA[The DJI Mic 3 clipped to a shirt]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DcQeMCgBMZ6kndj6qhdwCK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The DJI Mic 3 is the successor to the favorite microphone of content creators everywhere, the <a href="https://www.tomsguide.com/reviews/dji-mic-2">DJI Mic 2</a>. The Mic 3 brings some sizable upgrades, primarily aimed at vlogging and content creation. There are adaptive gain control modes to prevent clipping and new vocal tone presets to tailor the sound of your voice to your needs. </p><p>Making a return are the Mic 2’s powerful noise cancellation, again to prioritize vocals; 32-bit float recording; lossless 48kHz 24-bit wireless audio via its RX unit; timecode sync; and internal storage. For vloggers and most content creators, this is the mic to get, especially if you own DJI gear (with which it’ll hook up to seamlessly)</p><p>If you’re a professional video producer, though, or you shoot high-octane content, you’ll want to look elsewhere. The lack of a USB-C and 3.5mm lavalier port, plus the removal of the Mic 2’s secure clip, could make rivals a better shout. </p><p>To find out whether this is the <a href="https://www.tomsguide.com/best-picks/best-microphones">best microphone</a> for you, keep reading my full DJI Mic 3 review.</p><h2 class="article-body__section" id="section-dji-mic-3-review-specs"><span>DJI Mic 3 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>Starts at <a href="https://www.amazon.com/gp/aw/d/B0F99D67FQ" target="_blank" rel="nofollow"><u>$99</u></a> / <a href="https://www.amazon.co.uk/DJI-Charging-Microphone-Ultralight-Anti-Interference/dp/B0F99D67FQ" target="_blank" rel="nofollow"><u>£72</u></a> (solo TX) | Up to <a href="https://www.amazon.com/gp/aw/d/B0F995J8FR/" target="_blank" rel="nofollow"><u>$329</u></a> / <a href="https://www.amazon.co.uk/DJI-Charging-Microphone-Ultralight-Anti-Interference/dp/B0F995J8FR" target="_blank" rel="nofollow"><u>£259</u></a> (2TX + RX)  </p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>USB-C, Lightning, Wi-Fi, Bluetooth; OsmoAudio (Bluetooth)</p></td></tr><tr><td class="firstcol " ><p><strong>Max SPL</strong></p></td><td  ><p>130dB</p></td></tr><tr><td class="firstcol " ><p><strong>Max resolution / sample rate</strong></p></td><td  ><p>32-bit, 48kHz</p></td></tr><tr><td class="firstcol " ><p><strong>Frequency response</strong></p></td><td  ><p>20 Hz - 24 kHz</p></td></tr><tr><td class="firstcol " ><p><strong>Microphone type</strong></p></td><td  ><p>Omnidirectional</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>Up to 24 hours (including case recharging)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>0.5 ounces / 16g (TX)</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>1.13 x ‎1.11 x 0.6 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Black; White</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-mic-3-review-price-availability"><span>DJI Mic 3 review: Price & availability</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3dWHW7vLqgtXpmsnQ3vkYJ" name="DJI_Mic3_ 3.JPG" alt="The DJI Mic 3 2TX units each side of the RX unit" src="https://cdn.mos.cms.futurecdn.net/3dWHW7vLqgtXpmsnQ3vkYJ.jpg" mos="" align="middle" fullscreen="" width="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 DJI Mic 3 starts at <a href="https://www.amazon.com/gp/aw/d/B0F99D67FQ" target="_blank" rel="nofollow"><u>$99</u></a> / <a href="https://www.amazon.co.uk/DJI-Charging-Microphone-Ultralight-Anti-Interference/dp/B0F99D67FQ" target="_blank" rel="nofollow"><u>£72</u></a> for a solo transmitter (TX). The full 2TX + RX + charging case bundle costs <a href="https://www.amazon.com/gp/aw/d/B0F995J8FR/" target="_blank" rel="nofollow"><u>$329</u></a> / <a href="https://www.amazon.co.uk/DJI-Charging-Microphone-Ultralight-Anti-Interference/dp/B0F995J8FR" target="_blank" rel="nofollow"><u>£259</u></a>. That makes the Mic 3 cheaper than the Mic 2 was at launch ($349 for 2TX + RX), which is great to see — especially as DJI’s other products (cameras and drones) are typically priced very high in the U.S. compared to other regions these days. Thanks, tariffs.</p><p>At the time of writing, the <a href="https://www.tomsguide.com/audio/microphones/rode-wireless-go-gen-3-review">Rode Wireless Go Gen 3</a> — arguably the Mic 3’s biggest rival — costs <a href="https://www.amazon.com/R%C3%98DE-Wireless-Gen-Recording-Automatic/dp/B0DN1PGH94" target="_blank" rel="nofollow">$185</a> / <a href="https://www.amazon.co.uk/R%C3%98DE-Wireless-Gen-Recording-Automatic/dp/B0DN1PGH94" target="_blank" rel="nofollow">£148</a>, while the <a href="https://www.tomsguide.com/audio/rode-wireless-pro-review">Rode Wireless Pro</a> costs <a href="https://www.amazon.com/Wireless-Microphone-Recording-Microphones-Filmmaking/dp/B0CB2HGR9Q" target="_blank" rel="nofollow"><u>$255</u></a> / <a href="https://www.amazon.co.uk/R%C3%98DE-Microphone-Recording-Microphones-Filmmaking/dp/B0CB2HGR9Q" target="_blank" rel="nofollow"><u>£215</u></a>. These naturally lack some of the DJI-oriented connectivity features of the Mic 3, but likewise pack 32-bit float, strong battery life and internal recording. They’re much better choices for pros, thanks to 3.5mm lockable lavalier ports and secure clips/cold shoes.</p><h2 class="article-body__section" id="section-dji-mic-3-review-design-controls"><span>DJI Mic 3 review: Design & controls</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8invppWeYP9MK2MkYCjmoJ" name="DJI_Mic3_ 5.JPG" alt="Two DJI Mic 3 TX units" src="https://cdn.mos.cms.futurecdn.net/8invppWeYP9MK2MkYCjmoJ.jpg" mos="" align="middle" fullscreen="" width="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 DJI Mic 3’s design is closer to the budget-friendly <a href="https://www.tomsguide.com/audio/dji-mic-mini-review">DJI Mic Mini</a> than the Mic 2. The  Mic 3 transmitter (TX) units share the same square design as the Mic Mini’s TXs. They use the same opaque plastic (I miss the Mic 2’s transparent plastic design) and are a similar size to the Mini TXs. </p><p>The Mic 3’s TX units are substantially smaller than the larger, oblong Mic 2 TX units, not to mention the chunky, square units of the Rode Wireless Pro and Rode Wireless Go Gen 3. This makes the Mic 3 transmitters the most discrete pro wireless option on the market, and the most versatile too — you can affix the Mic 3 more easily to clothes as it’s less likely to weigh down lighter garments or elements, like lapels.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BydFLbUVbniVKrEPmNsWfJ" name="DJI_Mic3_ 8.JPG" alt="The DJI Mic 3 RX unit" src="https://cdn.mos.cms.futurecdn.net/BydFLbUVbniVKrEPmNsWfJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My biggest gripe is the mounting clip. On the Mic 2, the clip was permanently affixed to the microphone, giving lots of security. On the Mic 3, the clip is magnetically attached — this gives lots of versatility, as you can remove the clip altogether and just use a magnet. And for most low-octane purposes, that’s fine. But if you’re a motovlogger, or involved in other high-octane pursuits, look elsewhere. The magnet is not strong enough to resist powerful wind, so you may end up losing your mic. I’d recommend the Mic 2 or Rode Wireless Pro for those people instead.</p><p>The Mic 3’s receiver (RX) unit is similar to the Mic 2’s, only slightly lighter, and I have no complaints. It’s a super slick-looking RX, with a bright touchscreen and a command dial for navigation.</p><h4 id="charging-case-2">Charging case</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZSF2etdZZYcC2VjbLnnmfJ" name="DJI_Mic3_ 9.JPG" alt="The DJI Mic 3 2TX + RX + Charging case, with all components in the case" src="https://cdn.mos.cms.futurecdn.net/ZSF2etdZZYcC2VjbLnnmfJ.jpg" mos="" align="middle" fullscreen="" width="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>DJI has shrunk the charging case, shaving off 0.4 inches / 10mm. The case is also made from a lighter material, meaning the 2TX + RX + charging case now weighs 221g / 7.7 ounces in total, versus the Mic 2’s 284g / 10 ounces. That doesn’t sound like much, but my first thought on picking up the Mic 3 case was about how light the whole package felt. And trust me: when you’re lugging around a heavy bag full of gear, any weight saving is welcome.</p><p>Admittedly, the Mic 3’s charging case feels less premium and substantial than its predecessor, but that’s something I’m happy to sacrifice. And besides, build quality across the board is nevertheless typical DJI: excellent.</p><p>In addition to the case, the 2TX + RX combo comes with a carry pouch to store both the case and accessories. This makes for a much tidier experience than with the Rode Wireless Pro, which has two cases — one for the mic units and another (of the same size) for accessories.</p><h4 id="controls-2">Controls</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Ex7GdyCNnj2CWgVVkWtnxJ" name="DJI_Mic3_.JPG" alt="The DJI Mic 3 in hand" src="https://cdn.mos.cms.futurecdn.net/Ex7GdyCNnj2CWgVVkWtnxJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If using the RX, controls are super easy, as you have the same scroll wheel/button controls and bright screen as on the Mic 2. When using a standalone TX (either internally recording or hooked up wirelessly via Bluetooth), the onboard controls are a little basic, revolving around how many times/how fast you tap the single record button. It’s fine, just keep the user manual handy for the first few times you use it, so you can translate the flashing LED signals.</p><p>When using the Mic 3 with a DJI camera like the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-6-review">DJI Osmo Action 6</a> or <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review">DJI Osmo 360</a>, the camera’s menu system controls the mic, taking all guesswork out of the equation.</p><h2 class="article-body__section" id="section-dji-mic-3-review-features-connectivity"><span>DJI Mic 3 review: Features & connectivity</span></h2><p>The DJI Mic 3 carries over many of the Mic 2’s finest features, including 32-bit float recording — in this mode, the mics can record an enormous dynamic range, meaning you don’t need to worry about levels and clipping, and have lots of flexibility with levels in post without the need to add gain. There’s also 48kHz / 24-bit lossless recording wirelessly via the RX if you’re in a more controlled audio environment.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2gegPBvn55BniwsvycGXxJ" name="DJI_Mic3_ 10.JPG" alt="The DJI Mic 3 accessories on a table" src="https://cdn.mos.cms.futurecdn.net/2gegPBvn55BniwsvycGXxJ.jpg" mos="" align="middle" fullscreen="" width="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 Mic 3 features dual-band connectivity with automatic switching between 2.4Ghz and 5Ghz, allowing the mic to choose the optimal band. This works up to 1312 feet / 400 meters (assuming no interruptions), which is longer than the 980 feet / 280 meters range of the Rode Wireless Go Gen 3. Assuming signal interruptions (i.e. building/trees/people), with the Mic 3 you can expect around 260 feet / 80 meters of range, which is still pretty good.</p><p>You can hook up 4x RX and 8x TX units in sync, too, which is handy for larger-scale productions, and there’s a Quadrophonic mode designed specifically for Sony cameras that outputs audio in 4 tracks — again, useful for more complex productions.</p><p>The Mic 3 features internal storage, allowing you to record up to 57 hours of audio, higher than the 40-hours of the Rode Wireless Pro and 14 hours of the DJI Mic 2.</p><p>For pros and/or people who edit their footage, the Mic 3 also features timecode, allowing you to record audio separately to video and sync them precisely in post production. This will be helpful for content creators who don’t shoot with DJI cameras.</p><h4 id="ports">Ports</h4><p>Naturally, you can hook up the RX unit via TRRS (3.5mm), USB-C, or Lightning. There’s Bluetooth, too, for hooking up wirelessly to action cameras, and OsmoAudio (which is basically glorified Bluetooth) for quick and easy connection to DJI action cameras like the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review">DJI Osmo Action 5 Pro</a>, Osmo Action 6 and <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-nano-review">DJI Osmo Nano</a>. If you're using a vlogging camera like the <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3">DJI Osmo Pocket 3</a> or Pocket 4, it's the same story.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gPNuBsw9UyAxUCyWL5F6wJ" name="DJI_Mic3_ 6.JPG" alt="The DJI Mic 3 RX unit" src="https://cdn.mos.cms.futurecdn.net/gPNuBsw9UyAxUCyWL5F6wJ.jpg" mos="" align="middle" fullscreen="" width="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>Annoyingly, shrinking the Mic 3 TX units in size meant getting rid of the Mic 2’s USB-C port. That means, without the charging case, you can’t charge a Mic 3 TX unless you have a charging dock (sold with solo TX units and included in camera Creator Combos). I forgot my dock when on a press trip with the Osmo Pocket 4 Creator Combo, so wasn’t able to charge that TX unit on the go. Luckily I had my full 2TX + RX + Charging case at my hotel.</p><p>Equally annoyingly — and this will be a major point of contention for professionals — there’s no 3.5mm port on TX units for lavalier hookup. Now, I get the logic of this: the Mic 3 TX is small enough to place on a lapel, meaning it <em>IS</em> the lav. But there are other scenarios aside from interviews where you may want to run a lav — if you want to capture audio from a specific place where you can’t affix the TX unit, for example (I’ll cover this in the audio quality section below). </p><p>If that’s a dealbreaker, check out the Rode Wireless Go Gen 3 or Wireless Pro, as both feature lavalier ports with secure screw threads. If you use DJI gear and want the benefit of wireless hookup, the DJI Mic 2 has a 3.5mm lavalier port.</p><h2 class="article-body__section" id="section-dji-mic-3-review-audio-quality"><span>DJI Mic 3 review: Audio quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8HQrUadmTWfr9Q2PpGL9xJ" name="DJI_Mic3_ 4.JPG" alt="Two DJI Mic 3 TX units" src="https://cdn.mos.cms.futurecdn.net/8HQrUadmTWfr9Q2PpGL9xJ.jpg" mos="" align="middle" fullscreen="" width="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 Mic 3’s audio quality is seriously good. While it packs many features for hardcore video producers, let’s be real here: it’s primarily aimed at YouTubers. Well, for that purpose, it’s fantastic.</p><p>The sound is clear and professional. Plosives are well controlled, meaning no poppy-sounding Bs and Ps. Sibilance was a little less well controlled, with some hissing sounds on Ss, but nothing terrible. </p><h4 id="vocal-tone-modes">Vocal tone modes</h4><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/drE5O7fr54M" allowfullscreen></iframe></div></div><p>There are three vocal tone modes, which are essentially mic EQ settings for quickly tailoring the sound of your audio: Regular, Bright and Rich. They make a difference, but are fairly subtle. Bright indeed makes things sound a little crisper, while rich gives a warmth to the noise. Regular, the default mode, is a perfectly competent all-rounder, though, so I never really felt the need to use the other presets, although if you’re self conscious about aspects of  your voice, the presets could be of use.</p><h2 id="noise-reduction">Noise reduction</h2><p>As with the Mic 2 and Mic Mini, the Mic 3 packs environmental noise cancellation to cut background sounds and prioritize vocals. Below is a walking vlog I filmed for my <a href="https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review">DJI Osmo Pocket 4</a> review, which I paired with the DJI Mic 3. In the opening segment, I enabled the mic’s high noise reduction to cut out the noise of a busy road nearby. As you can hear, it did a fantastic job, cutting out road noise and bringing focus to my voice.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wBTZhStFd1o" allowfullscreen></iframe></div></div><p>Afterwards, in the video, I’m mostly using the mic with noise reduction disabled, as I wasn’t in super noisy environments. Audio quality is a little better, with a deeper, fuller tone to my voice, but that’s normal. The drawback of slightly decreased audio quality with noise reduction enabled is massively outweighed by the benefit of cutting out distracting/ruinous ambient sounds.</p><h2 id="professional-use">Professional use</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Pdofu6u2arM4cLC98sHxBK" name="DJI_Mic3_ 2.JPG" alt="The DJI Mic 3 magnetically clipped to a shirt" src="https://cdn.mos.cms.futurecdn.net/Pdofu6u2arM4cLC98sHxBK.jpg" mos="" align="middle" fullscreen="" width="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 Mic 3 also shines for professional work, at least where vocals are the priority. In a studio environment, you’ll of course have no issues, and this is as good a mic to use as the Rode Wireless Pro. </p><p>The Mic 3 is also fantastic for less predictable scenarios. I used the Mic 3 for two interviews at the Sony World Photography Awards 2026, interviewing professional photographers in the middle of a busy exhibition floor, with voices, other interviews and general clattering all around. A single Mic 3 did a perfect job of capturing the vocals of both me and my interviewees over the ambient noise, and I had no problems transcribing the interviews later on.</p><h2 id="32-bit-float">32-bit float</h2><p>In challenging dynamic ranges, you’ll want to use the Mic 3 in 32-bit float mode, where you don’t need to worry about levels. Unfortunately, in the motorcycling audio clip below, the wind buffeting got the better of both the physical deadcat and the noise reduction mode, so the resulting audio isn’t particularly pleasant to listen to.<br></p><audio src="https://cdn.mos.cms.futurecdn.net/6JhhrUsCBxPEy2sTt7mdBd/DJI%20Mic%203%20motovlog%20test.mp3"  controls="controls" preload="none"></audio><p><br>The mic was tucked inside the fold of a backpack, which still wasn’t enough to shelter it from the wind. If you’re a motovlogger, you’d want to get around this by running a lavalier to somewhere fully wind-shielded — with no 3.5mm port on the Mic 3, you can’t do that.</p><h2 class="article-body__section" id="section-dji-mic-3-review-battery-life"><span>DJI Mic 3 review: Battery life</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZXdCQGCE2SU5zyY7Jct4wJ" name="DJI_Mic3_ 7.JPG" alt="The DJI Mic 3 RX unit" src="https://cdn.mos.cms.futurecdn.net/ZXdCQGCE2SU5zyY7Jct4wJ.jpg" mos="" align="middle" fullscreen="" width="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>Each DJI Mic 3 TX has a maximum runtime of 8 hours, according to DJI, which is up from 6 hours on the Mic 2. It’s also better than the Rode Wireless Pro’s 7-hour battery life. That’s under ideal conditions, of course, without any of the bells and whistles like noise reduction enabled.</p><p>With a Mic 3 TX hooked up to an Osmo Pocket 4 and noise reduction enabled, the battery dropped to 80% after around 90 minutes. Extrapolating, that puts the Mic 3 at around 6 hours runtime in real-world usage.</p><p>Regardless, you’re unlikely to run out of battery on a single shoot unless you’re filming for 6 hours continuously. The Mic 3 RX unit is rated for 10 hours, so should last you an entire day of shooting. The charging case takes around 50 minutes to charge both the TX and RX units, so you should be able to recharge fully over a lunch break.</p><h2 class="article-body__section" id="section-dji-mic-3-review-verdict"><span>DJI Mic 3 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="DcQeMCgBMZ6kndj6qhdwCK" name="DJI_Mic3_ 1.JPG" alt="The DJI Mic 3 clipped to a shirt" src="https://cdn.mos.cms.futurecdn.net/DcQeMCgBMZ6kndj6qhdwCK.jpg" mos="" align="middle" fullscreen="" width="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 DJI Mic 3 knows exactly what it is and who it’s for. I could criticize it strongly for lacking features that hardcore professionals will want, and that the Rode Wireless Pro offers — things like a lavalier hookup and secure clip. But that wouldn’t really make much sense. The Mic 3 isn’t really for those people.</p><p>The Mic 2 tried to be all things to all people: beginners, content creators and pros alike. And to be fair, it did a fairly good job at that. The Mic 3 demonstrates DJI’s refinement of the formula to cater more to the people who use it most: YouTubers and social media creators.</p><p>And for those people, it’s perfect. Small, versatile, with clean audio, seamless connectivity options and a wealth of features to make a creator’s life easier. Vloggers, YouTubers and content creators: this is probably the mic for you.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested DJI’s new Osmo Pocket 4 — this is the only tool I'll recommend to content creators from now on ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/dji-osmo-pocket-4-review</link>
                                                                            <description>
                            <![CDATA[ The DJI Osmo Pocket 4 is the best all-in-one package for content creators, and there isn’t even any competition. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">x2kzo6tALv2w5iWHxbLAw5</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RLwbb2rXviBr8q8jaFhrSQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 21 Apr 2026 14:49:49 +0000</pubDate>                                                                                                                                <updated>Tue, 09 Jun 2026 10:32:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/RLwbb2rXviBr8q8jaFhrSQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Osmo Pocket 4 against a blue background]]></media:description>                                                            <media:text><![CDATA[DJI Osmo Pocket 4 against a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Osmo Pocket 4 against a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RLwbb2rXviBr8q8jaFhrSQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’re in any doubt as to the DJI Osmo Pocket 4’s significance to today’s content creator market, let me clear things up with an anecdote of sorts. I go to a lot of press events for cameras, and by far the most common camera I see being used by my fellow mediafolk is the <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3">DJI Osmo Pocket 3</a>.</p><p>YouTubers, vloggers, social media creators, journalists — all rely on the Pocket 3. Why? Because it’s absolutely fantastic. It wraps up everything you need for video content creation into a slick, high-performing package. So… why did DJI need to make the Osmo Pocket 4? It didn’t, to be honest. But it went ahead and did so anyway. </p><p>I’ll get this out of the way early. The Osmo Pocket 4 (OP4) is very much an evolution, not a revolution, to the chagrin of many interested parties, I’m sure. Before its launch, there were spy shots showing multiple lenses — people believed them precisely because the Osmo Pocket 3 (OP3) was so good at its job, the thought being that any new model would have to be radical to justify its own existence.</p><p>Alas, it isn’t radical, but there are a number of key upgrades under the hood. An improved 1-inch sensor and image processing, 4K/240fps slow motion, and film simulation profiles for in-camera grades, to name a few. So is this the new <a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">best camera</a> for vloggers? Find out in my full DJI Osmo Pocket 4 review.</p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-specs"><span>DJI Osmo Pocket 4 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p><a href="https://www.amazon.co.uk/DJI-Essential-Stabilization-Lossless-14%E2%80%91Stop/dp/B0FYQ1LFFK" target="_blank" rel="nofollow">£429</a> / U.S. launch pending</p></td></tr><tr><td class="firstcol " ><p><strong>Max resolution (standard)</strong></p></td><td  ><p>4K/60fps</p></td></tr><tr><td class="firstcol " ><p><strong>Max resolution (slow mo)</strong></p></td><td  ><p>4K/240fps</p></td></tr><tr><td class="firstcol " ><p><strong>Sensor size</strong></p></td><td  ><p>1 inch</p></td></tr><tr><td class="firstcol " ><p><strong>Rear screen</strong></p></td><td  ><p>2-inch touchscreen</p></td></tr><tr><td class="firstcol " ><p><strong>Internal memory</strong></p></td><td  ><p>107GB</p></td></tr><tr><td class="firstcol " ><p><strong>MicroSD slot</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, Wi-Fi, USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance</strong></p></td><td  ><p>None</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>1,545 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>5.6 x 1.7 x 1.3 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>6.7 ounces</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-price-availability"><span>DJI Osmo Pocket 4 review: Price & availability</span></h2><p>Unfortunately, it doesn’t look like the Osmo Pocket 4 will be coming to the U.S. just yet. DJI has had a rocky time with the U.S. government in recent years, facing a ban on its <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">drones</a>, and having been slapped with hefty tariffs on its other imports. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ryJg3h6sdompxvK9Ehh4wQ" name="DJI_osmo_pocket4 17.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/ryJg3h6sdompxvK9Ehh4wQ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The £549 DJI Osmo Pocket 4 Creator Combo, with all components packed into the included carry case. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>For many camera products, like the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-6-review">DJI Osmo Action 6</a> ($369) and <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review">DJI Osmo 360</a> ($549), this has meant no “official” support — so no first-party availability through DJI’s website and no aftercare plans. But you can still buy those products (at a mark up) from third party suppliers like Amazon. Alas, the Pocket 4 doesn’t fit that trend, and DJI has confirmed it won’t be coming to the U.S. at all… yet!</p><p>From DJI:<em> “We do not have U.S. pricing. The Osmo Pocket 4 will not be available in the U.S. market as the application for authorization is still pending.”</em> If you’re American, you’ll need to buy the +2-year-old DJI Osmo Pocket 3 instead for now, which remains steeply priced in the U.S. at <a href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD" target="_blank" rel="nofollow">$499</a> thanks to those tariffs.</p><p>The Osmo Pocket 4 is available everywhere else though, and in the U.K. it starts at <a href="https://www.amazon.co.uk/DJI-Essential-Stabilization-Lossless-14%E2%80%91Stop/dp/B0FYQ1LFFK" target="_blank" rel="nofollow">£429 from Amazon</a>. That’s actually a drop in launch price from the Pocket 3, which launched at £489, although you can pick up a Pocket 3 at the time of writing for <a href="https://www.amazon.co.uk/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD?th=1" target="_blank" rel="nofollow">£385</a>. </p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-design-controls"><span>DJI Osmo Pocket 4 review: Design & controls</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:944px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RLwbb2rXviBr8q8jaFhrSQ" name="DJI_osmo_pocket4 1.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/v2/t:549,l:513,cw:944,ch:531,q:80/RLwbb2rXviBr8q8jaFhrSQ.jpg" mos="" align="middle" fullscreen="" width="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 DJI Osmo Pocket 4 looks identical to its predecessor, with similar general proportions. And if it weren’t for some slightly different ridge patterning on either model, you’d struggle to tell the two apart. That’s no bad thing, though — it means the Pocket 4 is just as lightweight, pocketable and easy to use as its older sibling. Of course, build quality is typical DJI: second to none.</p><p>The controls are again very similar, with a gimbal joystick and record button at the front, plus a swivelling display that reveals two more buttons when in its horizontal position. These buttons are new — one is a dedicated quick zoom button and the other is a custom button for mapping your three most commonly-used functions via single, double and triple presses. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/5v8yA4inydLqVnzRPrnU2R.jpg" alt="DJI Osmo Pocket 4 against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/t9wpkDiyWq6pyWKCU85QxQ.jpg" alt="DJI Osmo Pocket 4 against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/cadiBK3ZthWUHnGGAJFrqQ.jpg" alt="DJI Osmo Pocket 4 against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/AMnqCvxHy4kXLqHi9if6cQ.jpg" alt="DJI Osmo Pocket 4 against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The custom button is super handy in theory, although the assignable options are quite limited. I regularly need to switch between gimbal modes, which is a bit fiddly in real time — being able to assign this to the custom button would’ve been ideal, but no such luck (not even via the C1/C2 custom modes, as these don’t save gimbal modes).</p><p>Most settings control is done via the touchscreen though, and it’s gorgeous. It’s bright, detailed and spacious enough for in-depth control of DJI’s intuitive and feature-packed menu system. I’m very familiar with DJI’s menu and find it easy to use in the heat of the moment, but if you aren’t, the learning curve isn’t too steep.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/UoZE5xsbqgP2XRSM5j6htQ.jpg" alt="DJI Osmo Pocket 4 against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Wk8b8NSM8ZRT8Y6tKsZ2aQ.jpg" alt="DJI Osmo Pocket 4 against a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>On the back of the gimbal is an electronic connector, allowing you to hook up an accessory — namely the clip-on vlogging fill light (available with the <a href="https://www.amazon.co.uk/DJI-Creator-Stabilization-Lossless-Transmitter/dp/B0FKT9K6CB" target="_blank" rel="nofollow">£549 Creator Combo</a>).</p><p>The Pocket 4 is not an action camera, so it isn’t waterproof. But that’s to be expected.</p><h4 id="connectivity">Connectivity</h4><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uu8BMrBcWzjv4pfdrn3jsQ" name="DJI_osmo_pocket4 14.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/uu8BMrBcWzjv4pfdrn3jsQ.jpg" mos="" align="middle" fullscreen="" width="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 Osmo Pocket 4 boasts the same wealth of connectivity options as its predecessor. It has a USB-C slot which enables the addition of an additional battery pack (very useful, pictured above). You can hook up wirelessly to your smartphone, and to Bluetooth accessories — and of course, connecting to DJI microphones via OsmoAudio (Bluetooth) is a mere screen-tap away. </p><p>Making a return is the electronic accessory connector on the back of the gimbal, too, for hooking up a vlogging light. In short, there’s everything you need for high-tier content creation on the go.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BDMo6DiYmEiD28U3FJjx2R" name="DJI_osmo_pocket4 7.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/BDMo6DiYmEiD28U3FJjx2R.jpg" mos="" align="middle" fullscreen="" width="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 107GB internal storage, up from nothing at all in the Pocket 3. This is the most generous internal storage DJI has yet fitted to one of its handheld cameras, and is more than double the 50GB found in its flagship action camera, the Osmo Action 6. DJI is championing internal storage these days, and I love it. It’s so reassuring to know you have extra space if your card fills or, worst case scenario, corrupts — you can still get the footage you need.</p><p>Naturally, there’s a MicroSD slot for expanding storage if needed, but with 107GB of storage on offer, I haven’t needed to yet. And besides, with internal storage, transfer speeds are faster (up to 800Mb/s).</p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-stabilization"><span>DJI Osmo Pocket 4 review: Stabilization</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VhoLT3ri3MmwhyutwbUBuQ" name="DJI_osmo_pocket4 8.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/VhoLT3ri3MmwhyutwbUBuQ.jpg" mos="" align="middle" fullscreen="" width="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 DJI Osmo Pocket 4 uses the same 3-axis gimbal design as its predecessor, although there have been some internal tweaks to the algorithms, vastly improving stabilization, according to DJI. Honestly, the Pocket 3’s stabilization was excellent to begin with, so I’ve struggled to tell the difference. But hey, they’re both absolutely fantastic.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iBACJi6B_uo" allowfullscreen></iframe></div></div><p>As you can see in the footage throughout this review, it’s super easy to shoot long, smooth pans and tilts. The stabilization also works wonders to iron out the bumpiness of walking. If you’re going to be vlogging on the move, especially when walking, there’s no better and more compact way to get ultra-smooth, professional footage than the Pocket 4.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/hC0lz40rmb0" allowfullscreen></iframe></div></div><p>There are three different gimbal modes to allow you to customize the behavior of the stabilization. I mainly stick to the default 'Follow' and 'Tilt Locked' (horizon locked) as these are great for everyday use, mostly minimizing drift but allowing some natural movement. There’s also an 'FPV-' mode, though, where the gimbal always matches the direction the screen is facing, until you use the joystick. It’s kinda like a manual mode, and I found it very useful for restricting the gimbal movement when I didn’t want drift or tracking.</p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-autofocus"><span>DJI Osmo Pocket 4 review: Autofocus</span></h2><p>The DJI Osmo Pocket 4 brings back a couple of handy autofocus modes from the Pocket 3. There’s Spotlight Follow, which prioritizes registered subjects in frame. You add subjects and the camera tracks them over other stuff the Dynamic Active Tracking (i.e. automatic subject detection) detects. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3328px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="5FhcAArTfUdNxw4Q2KHeZK" name="IMG_0865" alt="The DJI Osmo Pocket 4 with the screen being used to view tracked subjects in frame" src="https://cdn.mos.cms.futurecdn.net/5FhcAArTfUdNxw4Q2KHeZK.jpg" mos="" align="middle" fullscreen="" width="3328" height="1872" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Spotlight Follow sticks to the first-detected subject in any scene until that subject leaves the frame. It’s ideal for solo vlogging, although if you have multiple people in frame at different distances from the lens, you might end up with one out of focus as the camera prioritizes the first subject in frame.</p><p>There’s also a Dynamic Framing frame which allows you to set the focus area from 9 central points. It’s a helpful bit of manual control for when you need to lock focus.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3415px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AmBeb3FnqrCSUzHnJPxwaK" name="IMG_0877" alt="The DJI Osmo Pocket 4 with the screen being used to view tracked subjects in frame" src="https://cdn.mos.cms.futurecdn.net/AmBeb3FnqrCSUzHnJPxwaK.jpg" mos="" align="middle" fullscreen="" width="3415" height="1921" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Honestly, though, I just left the camera out of these modes most of the time and in its basic autofocus and Dynamic Active Tracking (automatic subject detection and tracking) mode, which works really well. It prioritizes faces, which is what you’d want, but can recognize wider shots, prioritizing deeper focal range — switch to closer subjects if faces come into frame. It’s perfect for vlogging, though, and I never recorded a clip where my face was out of focus when talking to camera.</p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-video-quality"><span>DJI Osmo Pocket 4 review: Video quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QD9u6T39KMHHMQDnk4jixQ" name="DJI_osmo_pocket4 2.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/QD9u6T39KMHHMQDnk4jixQ.jpg" mos="" align="middle" fullscreen="" width="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 OP4’s 4K footage looks beautiful and sharp, with bold, vibrant colors… although it’s not like the older OP3’s video looked bad. The lens gives a nice, wide field of view that doesn’t suffer from too much ugly barrel distortion, making it perfect for vlogging. There are two zoom levels, 2x and 4x, which are “lossless,” according to DJI — although I’m not really sure what that means, as you can see the resolution taking a big hit at the increased zoom levels in the vlogging clip below.</p><p>In normal video mode, the Pocket 4 shoots 4K at up to 60fps in 16x9 landscape orientation, and 3K at up to 60fps in 9x16 vertical orientation — the same as the Pocket 3. However, slow motion has received a big boost, with the OP3 able to shoot up to 4K/240fps (versus 4K/120fps), for twice as slow footage. Check out the vlogging video in this section to see an example.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/wBTZhStFd1o" allowfullscreen></iframe></div></div><p>Perhaps the main change to the core imaging gear is a revamped 1-inch sensor, which delivers super clean images with lots of detail, vibrant color, and increased dynamic range (up to 14 stops from 12 on the OP3). I was impressed with the dynamic range: standing in a shaded area on a bright day, the camera rendered both detailed shadows and bright highlights in the same frame.</p><p>There’s 10-bit color for over a billion individual tones, delivering more natural colors and smoother color transitions. 10-bit also provides more editing flexibility thanks to the greater amount of tonal data recorded. </p><p>DJI has done away with D-Log M, its historic “log” profile, which technically wasn’t a log profile but just a desaturated color profile. Now there’s D-Log Pro, which is legitimately a logarithmic gamma correction curve, and delivers wider dynamic range capture (the trade-off being it needs grading in post). DJI has also binned HLG HDR, which makes sense — this is primarily used by the broadcast media industry, so it always felt a bit redundant on vlogging cameras, like the Osmo Pocket line.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/09Xhi4dVIIA" allowfullscreen></iframe></div></div><p>If you want to apply some in-camera grades, the Pocket 4 has color filters, akin to the color filters on DJI’s action cameras. These are nothing special — no Fuji-level film-sim color science — but nice to have for some quick creative looks. I love DJI’s default color profile, which produces vibrant blues and greens on sunny days, so I mostly left the camera in that aside from testing.</p><p>There are also some new beauty filters, to smooth out skin tones and generally pep up appearance on vlogging. I’m not personally a fan of this type of thing, but if you are, they’re there for you to use.</p><h4 id="low-light">Low light</h4><p>The new 1-inch sensor, with its increased dynamic range, delivers cleaner shadows than the OP3, making the OP4 a better tool for low light footage. In moderately low light, the Low Light mode (capped at 4K/30fps) does a great job at brightening footage, and noise was barely perceptible (see the walking clip in the Stabilization section, which was shot in the Low Light mode).</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Rva640E264M" allowfullscreen></iframe></div></div><p>In very dark conditions, as in the video above, the Pocket 4’s image sharpness takes a noticeable hit, with a watercolor effect on the background from the smoothing of in-camera noise reduction. However, this is a very challenging scenario, and I think the footage and smoothing looks pretty good, all things considered.</p><p>My Pocket 4’s auto exposure had a little bit of trouble in certain low light conditions, flickering constantly as it tried to balance exposure. This happened mostly in medium-dark situations, where there was a little bit of light entering the frame. It was solved by locking the exposure. I've reached out to DJI to establish why this might be, and if there's a fix in the works.</p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-audio-quality"><span>DJI Osmo Pocket 4 review: Audio quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pFhj7BMEcpnxQsRsNEnw2R" name="DJI_osmo_pocket4 15.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/pFhj7BMEcpnxQsRsNEnw2R.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’ll be honest here and say that if you’re not looking to use the DJI Osmo Pocket 4 with a DJI microphone, you won’t be using it properly. This camera is designed to be used with the <a href="https://www.tomsguide.com/reviews/dji-mic-2"><u>DJI Mic 2</u></a>, Mic 3 or <a href="https://www.tomsguide.com/audio/dji-mic-mini-review"><u>Mic Mini</u></a>, and doing so will give you excellent, YouTube-quality audio, with clean vocals and strong ambient noise reduction — as you can hear in the walking vlog above.</p><p>Using OsmoAudio — i.e. pairing the camera via Bluetooth with one of DJI’s Mics — gives you access to four audio channel recording, spatial audio and audio zoom, where the audio direction matches the zoom area.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/sp27OD2WuUI" allowfullscreen></iframe></div></div><p>That said, if you can’t stretch to a standalone mic just yet, or one of the creator combos that bundles a mic, the OP4 will still do the trick. Like the OP3, there are 3 internal microphones, plus wind reduction and voice priority modes. You can hear in the clip above how the internal mics sound in quiet and noisy conditions, with both those settings on. The result? Fine, and passable, but nothing like the quality you’ll get when hooking up a DJI mic.</p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-app"><span>DJI Osmo Pocket 4 review: App</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5333px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="u8xR3sFT9qiEFs6ENRQYQn" name="DJI Mimo — Osmo Pocket 4" alt="Two screenshots of the DJI Mimo app in use with the Osmo Pocket 4" src="https://cdn.mos.cms.futurecdn.net/u8xR3sFT9qiEFs6ENRQYQn.jpg" mos="" align="middle" fullscreen="1" width="5333" height="3000" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/u8xR3sFT9qiEFs6ENRQYQn.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DJI / Future)</span></figcaption></figure><p>I’m a big fan of the DJI Mimo app, which has come a long way in the last few years. It’s now slick, feature-packed and fairly reliable (I still experience the odd issue connecting devices over Wi-Fi on my <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review"><u>iPhone 17 Pro Max</u></a>). The Mimo app is your central point of control for the Pocket 4, and used for registering your device, updating it, live camera control and editing.</p><p>I really like the editing functionality in particular. I roughly spliced together the vlogging video above in around an hour between meetings. I was able to cut and arrange clips, apply effects, animations and music, and generally put out a decent looking short video in very little time. Sure, it’s a bit clunkier to use than desktop editing software, but for creators editing on the go, it’s very good.</p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-battery-life-overheating"><span>DJI Osmo Pocket 4 review: Battery life & overheating</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RLWRgkFNsLDYqDPURtcptQ" name="DJI_osmo_pocket4 16.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/RLWRgkFNsLDYqDPURtcptQ.jpg" mos="" align="middle" fullscreen="" width="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>DJI rates the OP4 for 240 minutes, up from 166 minutes on the OP3. The caveat there, though, is that those figures are at 1080p. At 4K/60fps, which is where we test all our cameras (if they shoot at 60fps), you can expect less. Realistically, that’s where most people will want to shoot.</p><p>In real world testing at a mixture of 4K/60fps, 4K/30fps and 4K/240fps, I shot for around 80 minutes, recording around 40 short clips. The battery only dropped to around 50%, suggesting 160 minutes of runtime. </p><p>In my lab testing at 4K/60fps, the camera lasted for around 140 minutes, which is very impressive. What’s even more impressive is the thermal performance — the lab test is conducted indoors away from the cooling effects of wind and cold ambient temperatures. The OP4 got a little warm, but not hot, and didn’t overheat at all, recording in 4K/60fps continuously until the battery died.</p><h2 class="article-body__section" id="section-dji-osmo-pocket-4-review-verdict"><span>DJI Osmo Pocket 4 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cadiBK3ZthWUHnGGAJFrqQ" name="DJI_osmo_pocket4 13.JPG" alt="DJI Osmo Pocket 4 against a blue background" src="https://cdn.mos.cms.futurecdn.net/cadiBK3ZthWUHnGGAJFrqQ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you’re a vlogger, influencer or other content creator, especially one who records out and about regularly, there really is no better all-in-one package than the DJI Osmo Pocket 4. If you want beautiful, professional-looking video, with solid audio and a wealth of connectivity options, it’s <em>the</em> camera for you.</p><p>Sure, it’s a refinement of the Pocket 3 rather than a wholesale revamp, but as I mentioned in my intro, the Pocket 3 was already the content creator’s default tool for a reason: it was fantastically good at its job, so there wasn’t much that needed changing.</p><p>The Pocket 4 upgrades all the right things. Changes to the sensor, stabilization and battery life, plus the shedding of some unnecessary features to make way for more genuinely useful ones. DJI has knocked it out of the park… again.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Here’s the one robot vacuum I wish was coming to the US (and what to buy instead) ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/home/home-appliances/dji-romo-p-the-one-robot-vacuum-i-wish-was-coming-to-the-states-but-what-to-buy-instead</link>
                                                                            <description>
                            <![CDATA[ The DJI Romo P is DJI's first robot vacuum, and what an entry! It's just a shame it won't be landing Stateside. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">s8MDTCbRUMeN9vMHQDqru9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LFxtf2sGHj6dMZY8mxMrgc-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 15 Apr 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Home Appliances]]></category>
                                                    <category><![CDATA[Home]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/LFxtf2sGHj6dMZY8mxMrgc-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Romo P in use on a hard wood floor]]></media:description>                                                            <media:text><![CDATA[DJI Romo P in use on a hard wood floor]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Romo P in use on a hard wood floor]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LFxtf2sGHj6dMZY8mxMrgc-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The DJI Romo just launched in the U.K., where I live, and I’ve been testing it out for several months now. And I gotta say, I love it. I’m no stranger to the best robot vacuums — my team tests a lot of them in our U.K. testing lab, and I’ve had to set up and use many of them before.</p><p>The Romo P has really got to me though. It’s the first robot vacuum I’ve liked enough to actually take home and clean with regularly. It blends powerful performance with a (typically-DJI) slick and feature-stuffed application. It looks brilliant, too (although its design is pretty divisive). And with the likes of Shark, Roborock and Dreame, now <em>would’ve</em> been a great time for a new player to enter the arena in the States.</p><p>Key point: “<em>would’ve</em>”. See, there’s a pretty big catch, making this <a href="https://www.tomsguide.com/us/best-robot-vacuums,review-2000.html">robot vacuum</a> bittersweet. Here's why.</p><h2 class="article-body__section" id="section-the-sweet-what-i-love"><span>The sweet: What I love</span></h2><p>Firstly, I’ll cover what I love about this robot vacuum. I mean it when I say DJI has made a killer product here. For a first foray into robot vacuums, or cleaning devices in general for that matter, this is an amazing start.</p><p><em>The DJI Romo P costs </em><a href="Here’s the one robot vacuum I wish was coming to the States (and what to buy instead)" target="_blank" rel="nofollow"><em>£1,299</em></a><em> / </em><a href="https://store.dji.com/au/product/dji-romo-p-water-tank-version" target="_blank" rel="nofollow"><em>AU$2,299</em></a><em>.</em></p><h3 id="decent-vacuuming-capabilities">Decent vacuuming capabilities</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="n2apmZ6AT5KBQTNect22sc" name="DJI_ROMO_ 15.JPG" alt="DJI Romo P in use on a hard wood floor" src="https://cdn.mos.cms.futurecdn.net/n2apmZ6AT5KBQTNect22sc.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Obviously, the most important aspect to consider is how well this thing can clean. And happily the answer is: pretty well. My home’s first floor (that’s the ground floor in the U.K.) is a combination of oak flooring and medium-pile carpet. And overall, the Romo did a pretty good job of cleaning it.</p><p>I have two dogs, and the Romo P has experienced no issues vacuuming up most of their hair and dander from our hard flooring, even as they both started shedding when the weather warmed up in early April. Throughout the winter months, the Romo was also able to sweep up the debris they brought in from our yard, plus general day-to-day dust and dirt. </p><p>I’ve been impressed with how the Romo handles carpet, too. It cleaned my lounge carpets of dog hair with ease, and left super satisfying vacuum marks across the pile — kinda like a freshly mowed tennis pitch. That’s 25,000Pa suction for you (i.e., pretty powerful)!</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NtiincFwF8oJg85ZErZQoc" name="DJI_ROMO_ 17.JPG" alt="DJI Romo P in use on a hard wood floor" src="https://cdn.mos.cms.futurecdn.net/NtiincFwF8oJg85ZErZQoc.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Admittedly, it doesn’t do a great job of edges and corners, and dirt sometimes gets missed. See, the Romo uses plastic spinning fingers (we’ve named ours “Sal”, short for “Salad Fingers” — my fellow millennials will relate), which don’t quite get into the corners well enough. They’re also a little weak — you can watch debris get missed in real time, instead of being pushed into the suction path.</p><p>While the corner performance necessitates pulling out your main vacuum (in my case the fantastic <a href="https://www.tomsguide.com/home/home-appliances/dreame-z30-review">Dreame Z30</a>), the latter is easily solved by simply telling the vacuum to use higher power and repeat areas up to two more times. This uses more battery, but after two loops on high power of my full downstairs, Sal has always kept enough juice to mop afterwards.</p>        <div class="featured_product_block featured_block_hero" data-id="0be17b3d-40c4-4986-9f08-656f681f7643">            <a href="https://www.amazon.co.uk/DJI-Transparent-Drone-Level-Maintenance-Free-Customizable/dp/B0FPRK3FNV" data-model-name="DJI Romo P Robot Vacuum Cleaner and Mop With Transparent Design, 25,000 Pa Suction." 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/oXTa2v8LMtpfALo7ffmRLZ.jpg" alt="Dji Romo P Robot Vacuum Cleaner and Mop With Transparent Design, 25,000 Pa Suction, Drone-Level Sensing, Dual Robotic Arms, 200-Day Maintenance-Free Operation, Customizable Mopping Solutions"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>DJI</div>                                        <div class="featured__title">DJI Romo P Robot Vacuum Cleaner and Mop With Transparent Design, 25,000 Pa Suction.</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="de8b7bd3-ea5b-4e20-ab50-9a65984b277a">            <a href="https://www.amazon.co.uk/DJI-Drone-Level-Anti-Tangle-Maintenance-Free-Self-Cleaning/dp/B0GHS617V1/" data-model-name="DJI Romo S With Accessory Kit, Robot Vacuum and Mop, 25,000 Pa Suction." 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/CFbcXfkyExtbdpbdUQXL3i.jpg" alt="Dji Romo S With Accessory Kit, Robot Vacuum and Mop, 25,000 Pa Suction, Drone-Level Obstacle Sensing, Anti-Tangle Roller Brush, 200-Day Maintenance-Free Self-Cleaning Base Station"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>DJI</div>                                        <div class="featured__title">DJI Romo S With Accessory Kit, Robot Vacuum and Mop, 25,000 Pa Suction.</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div><h3 id="an-impressive-mopper">An impressive mopper</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="dXDfRXU9CgzPHN4YkAUHsc" name="DJI_ROMO_ 20.JPG" alt="DJI Romo P in use on a hard wood floor" src="https://cdn.mos.cms.futurecdn.net/dXDfRXU9CgzPHN4YkAUHsc.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>My dogs constantly walk mud into the house through the winter months. In North East Somerset, near Bath U.K., where I live, the soil is red clay. That meant red-brown paw prints and smears everywhere. The Romo P is a thorough mopper. It uses two circular pads, a cleaning solution and a deoderizing solution — that means you can set it to wash, deoderize and then rinse floors, for a truly thorough clean. </p><p>It’s hands-free, too. The base station hosts a dirty water tank and bag, which the vacuum self empties into. It also heats, rinses and cleans its own mop pads, so there’s no dirty work for you to do.</p><h3 id="fantastic-mapping-and-obstacle-avoidance">Fantastic mapping and obstacle avoidance</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:5333px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="h7bJ3gbXWgWkNgdnBfZQrf" name="Romo P Screenshot" alt="The DJI Home app being used to customize the DJI Romo P" src="https://cdn.mos.cms.futurecdn.net/h7bJ3gbXWgWkNgdnBfZQrf.jpg" mos="" align="middle" fullscreen="1" width="5333" height="3000" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/h7bJ3gbXWgWkNgdnBfZQrf.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DJI)</span></figcaption></figure><p>Also key to the Romo P’s performance are the mapping and obstacle avoidance. Mapping is super easy, very thorough, and highly accurate. The Romo detected all the obstacles in my lower floor on its first map.</p><p>Mapping and behavior aren’t necessarily the same thing though. Some vacuums, like the <a href="https://www.tomsguide.com/home/roborock-q10-s5-review">Roborock Q10 S5+</a>, map just fine, then still decide to bounce into every obstacle they encounter. The Romo has got stuck a few times under my sofa, which bows downwards when people are sitting on it, trapping the vac, but has otherwise never knocked a skirting board, never nudged a chair leg, and never bumped a sleeping dog’s nose. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4686px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BGte2YdZkB4HQwrzZJSbug" name="Romo_P Obstacle" alt="The DJI Romo P avoiding a dog" src="https://cdn.mos.cms.futurecdn.net/BGte2YdZkB4HQwrzZJSbug.jpg" mos="" align="middle" fullscreen="" width="4686" height="2636" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Even Nutty has come to accept Sal as part of our home! </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It has no issues adjusting in real time to new changing obstacles, returning later to check whether it can vacuum those areas, and simply leaving them out if necessary. Like I said earlier, this is something even established brands struggle with. </p><p>For DJI to nail the obstacle detection and avoidance first time out? It’s impressive. Although not surprising given the obstacle avoidance systems the brand is well-regarded for in its drones. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4268px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="Kv5GkFeCyjX5oaXDMJaSjg" name="Romo_P in use" alt="The DJI Romo P under a chair" src="https://cdn.mos.cms.futurecdn.net/Kv5GkFeCyjX5oaXDMJaSjg.jpg" mos="" align="middle" fullscreen="" width="4268" height="2400" attribution="" endorsement="" 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 also the super-fun ability to remote control the Romo P and even broadcast your voice through the speaker — I can use this to tell my greyhounds to get the hell out of the way (not that they ever listen). </p><p>The remote control function is only for manoeuvring specifically around obstacles though, as you can’t vacuum while doing so. Given how good the mapping and avoidance are, it’s pretty pointless after the novelty has worn off.</p><h2 id="feature-packed-app">Feature-packed app</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5333px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GCs43orpq6HSTGhb7BiRha" name="DJI Home App — Romo P" alt="The DJI Home app being used to customize the DJI Romo P" src="https://cdn.mos.cms.futurecdn.net/GCs43orpq6HSTGhb7BiRha.jpg" mos="" align="middle" fullscreen="1" width="5333" height="3000" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/GCs43orpq6HSTGhb7BiRha.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DJI)</span></figcaption></figure><p>Robot vacuums are nothing without strong applications to interface with the user. Again, DJI has flexed its full tech-giant might here and produced a slick, comprehensive companion application, first time around, no sweat.</p><p>The DJI Home app was a little janky on the early access software I started testing with. But after a few updates, it’s typical DJI: super polished. You use the app to set routes and maps, customize cleaning routines, set auto-clean times, check consumables, and more. It has everything I could ask for from a companion app.</p><h2 id="neo-retro-styling">Neo-retro styling</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/EommDKcdLtUeEbDfJoWRfc.jpg" alt="DJI Romo P in use on a hard wood floor" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/D9oenDKPpdKNNY84vbmSTc.jpg" alt="DJI Romo P in use on a hard wood floor" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iQze89nW3GdgAj3XeY99Fc.jpg" alt="DJI Romo P in use on a hard wood floor" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Finally, there’s the design. Now, almost everyone I’ve talked to thinks this thing is ugly as hell. And I’ll admit, it isn’t one for traditionalists. But I love it. The white, see-through design is full neo-noughties-retro, and I’m there for it. It’s like a Nothing Phone and an Apple iMac G3 met up in Cyberpunk 2077 and had a baby.</p><h2 class="article-body__section" id="section-the-bitter-what-i-don-t-love"><span>The bitter: What I don't love</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hcNAAjY7ggjz9UeCPxzgrc" name="DJI_ROMO_ 18.JPG" alt="DJI Romo P in use on a hard wood floor" src="https://cdn.mos.cms.futurecdn.net/hcNAAjY7ggjz9UeCPxzgrc.jpg" mos="" align="middle" fullscreen="" width="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 aren’t that many downsides to the DJI Romo P. Sure, its corner performance isn’t the best and admittedly it’s very pricey. You can pick up the equally excellent (and oh-so-catchily-named) Shark PowerDetect 2-in-1 ThermaCharged NeverTouch for £300 less. That’s about it, though. </p><p>In the U.K. and worldwide markets, I anticipated a shortage of third party consumable replacements. After all, DJI is a new player in this game, so I expected to be without the large ecosystem of third party accessories you can buy for well-established rivals, like Dreame and Shark.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JyfSPNMeUAF7Dyvi4jX9Dc" name="DJI_ROMO_ 8.JPG" alt="DJI Romo P in use on a hard wood floor" src="https://cdn.mos.cms.futurecdn.net/JyfSPNMeUAF7Dyvi4jX9Dc.jpg" mos="" align="middle" fullscreen="" width="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>And, to be fair, the options are (only-very-slightly) limited. The Romo has been available in worldwide markets for long enough to have a respectable roster of third party accessories available on Amazon, like bags, mop heads and rollers. </p><p>Annoyingly, though, the Romo uses proprietary-shaped bottles of cleaning solution, rather than a solution refillable tank. That means options for replacement cleaning solutions are limited.</p><h3 id="no-u-s-availability-for-now">No U.S. availability for now</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="Vozhn2foR79cMbEMobMnpc" name="DJI_ROMO_ 16.JPG" alt="DJI Romo P in use on a hard wood floor" src="https://cdn.mos.cms.futurecdn.net/Vozhn2foR79cMbEMobMnpc.jpg" mos="" align="middle" fullscreen="" width="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>Alas, if you know anything about DJI right now, you’ll know it isn’t having much fun in the U.S. thanks to the application of tariffs and an ongoing feud with the Federal government over its drones. As such, the Chinese manufacturer has effectively stopped releasing most of its new products “officially” to the American market. </p><p>I say “officially” because many of them, like the DJI Osmo Action 6, are still available in the U.S. via third parties like Amazon. I was hoping for the same to be true for the Romo P. Unfortunately, that’s not the case.</p><p>And it’s a huge shame. I love this robot vacuum, and I would love to recommend it to our Tom’s Guide U.S. readership. But given I write mostly for a U.S. audience, that can’t happen.</p><p>If you’re outside the U.S., the top-tier, vacuum/mop-cable <a href="Here’s the one robot vacuum I wish was coming to the States (and what to buy instead)" target="_blank" rel="nofollow">DJI Romo P costs £1,299</a> / <a href="https://store.dji.com/au/product/dji-romo-p-water-tank-version" target="_blank" rel="nofollow">AU$2,299</a>. The lower-tier versions are cheaper. There's the DJI Romo A, which costs <a href="https://www.amazon.co.uk/DJI-Drone-Level-Maintenance-Free-Operation-Anti-Tangle/dp/B0FPRJLLNB" target="_blank" rel="nofollow">£1,049</a> / <a href="https://store.dji.com/au/product/dji-romo-a-water-tank-version" target="_blank" rel="nofollow">AU$1,899</a>, and features an opaque base station (but a see-through robot) and no deodorizer tank. And the Romo S, which costs <a href="https://store.dji.com/uk/product/dji-romo-s-water-tank-version" target="_blank" rel="nofollow">£929</a> / <a href="https://store.dji.com/au/product/dji-romo-s-water-tank-version" target="_blank" rel="nofollow">AU$1,599</a> and features an opaque base station and robot, plus no deodorizer tank.</p><h2 class="article-body__section" id="section-united-states-what-to-buy-instead"><span>United States: What to buy instead</span></h2>        <div class="featured_product_block featured_block_hero" data-id="0d519cdd-5372-4147-a4b8-401e3f61ceed">            <a href="https://www.amazon.com/Shark-ThermaCharged-Self-Emptying-Technologies-RV2920XE/dp/B0FLDZW5G7" data-model-name="Shark 2-in-1 Powerdetect Thermacharged Nevertouch Pro" 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/mqBTyjx5rEEJRHNw8XkYDT.jpg" alt="Shark Robot Vacuum & Mop Combo, Powerdetect Thermacharged Nevertouch Pro, Self-Emptying, Self-Refill With Heated Mop Cleaning, 60-Day Capacity,30-Day Tank, 6 Power Detect Technologies, Black, Rv2920xe"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Shark</div>                                        <div class="featured__title">Shark 2-in-1 Powerdetect Thermacharged Nevertouch Pro</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="9cd2e90b-d924-4661-bdfe-e63888e12b4c">            <a href="https://www.amazon.com/ECOVACS-T30S-ZeroTangle-Technology-Self-Emptying/dp/B0D1FMPJJJ/" data-model-name="Ecovacs Deebot T30s" 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/94P5f6zM2E4VWnQRUXqhXc.jpg" alt="Ecovacs Deebot T30s Combo Robot Vacuum and Mop, All-In-One Cleaning Hub, 11000pa, Zerotangle Technology, Truedge Adaptive Edge Mopping, Dual Self-Emptying, Hot Water Mop Washing, Auto-Mop Lifting"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>ECOVACS</div>                                        <div class="featured__title">Ecovacs Deebot T30s</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div><p>Don’t fear, though, there are plenty of amazing robot vacuums out there for you to buy in the States. The <a href="https://www.tomsguide.com/home/smart-home/shark-powerdetect-2-in-1-robot-vacuum-and-mop-review"><u>Shark PowerDetect 2-in-1</u></a> costs $999 and is our favorite robot vacuum/mop. Its beefier sibling, the <a href="https://www.tomsguide.com/home/home-appliances/shark-powerdetect-2-in-1-thermacharged-nevertouch-review"><u>Shark PowerDetect 2-in-1 ThermaCharged NeverTouch</u></a>, features similar hands-free maintenance and heated mopping, but for $1,199 (this would be my choice). There’s also the <a href="https://www.tomsguide.com/home/smart-home/ecovacs-deebot-t30s-combo-review"><u>Ecovacs Deebot T30</u></a>, which scored a fantastic 4-star rating in our review, although costs $1,300 — for that money, I’d buy the Shark.</p><p>For a cheaper alternative, check out the $999 <a href="https://www.tomsguide.com/home/smart-home/eufy-e28-3-in-1-robot-vacuum-review"><u>Eufy E28</u></a> or $899 Eufy E25 (basically the same as the E28, minus spot cleaning) or the $499 <a href="https://www.tomsguide.com/home/smart-home/i-tested-the-dreame-l10s-ultra-gen-2-robot-vacuum-and-mop-and-its-one-of-the-best-values-yet"><u>Dreame L10S Ultra Gen 2</u></a>. Whatever you choose, enjoy your spring cleaning!</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eG0RmW"></div>                            </div>                            <script src="https://kwizly.com/embed/eG0RmW.js" async></script><p><em>Have I missed any criteria from the poll? Let me know in the comments.</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/home/stop-sneezing-at-home-this-allergy-season-with-these-expert-approved-tips-for-your-robot-vacuum">Stop sneezing at home this allergy season with these expert-approved tips for your robot vacuum</a></li><li><a href="https://www.tomsguide.com/home/im-a-robot-vacuum-expert-and-after-seeing-this-vacuum-that-can-climb-over-obstacles-its-the-only-feature-i-care-about">I’m a robot vacuum expert, and after seeing this vacuum that can climb over obstacles, it’s the only feature I care about</a></li><li><a href="https://www.tomsguide.com/home/roborock-saros-20-vs-shark-powerdetect-2-in-1-which-premium-robot-vacuum-is-worth-the-money">Roborock Saros 20 vs Shark PowerDetect 2-in-1 — Which premium robot vacuum is worth the money?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI announces new Lito drone, possibly the last one coming to the US ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-announces-new-lito-drone-possibly-the-last-one-coming-to-the-us</link>
                                                                            <description>
                            <![CDATA[ The DJI Lito has appeared in FCC filings suggesting it could be the last new drone released in the US by the company. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">S8YHvocJncPsnPR4MPU8AF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RhBNBu5rrqpSg2y88xHtWh-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Tue, 14 Apr 2026 21:57:24 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/RhBNBu5rrqpSg2y88xHtWh-1280-80.png">
                                                            <media:credit><![CDATA[DJI]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Mini 2 SE]]></media:description>                                                            <media:text><![CDATA[DJI Mini 2 SE]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Mini 2 SE]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RhBNBu5rrqpSg2y88xHtWh-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>DJI has faced a ban on importing and selling drones in the United States since December 2025, but the company may have slipped one final drone under the wire. Between leaks, official announcements and FCC filings DJI may have one more drone for American enthusiasts to enjoy.</p><p>Today, DJI posted a teaser video for the new Lito drone, which could be the last DJI model to receive FCC certification, pending the outcomes of <a href="https://www.tomsguide.com/cameras-photography/drones/fcc-exceeded-its-statutory-authority-claims-dji-in-lawsuit-to-overturn-drone-ban">various legal battles</a>. The teaser promised an official reveal on April 23. </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/DXHIBHCAcUa/" target="_blank">A post shared by DJI (@djiglobal)</a></p><p>A photo posted by  on </p></blockquote></div><p>Based on <a href="https://apps.fcc.gov/oetcf/eas/reports/ViewExhibitReport.cfm?mode=Exhibits&RequestTimeout=500&calledFromFrame=N&application_id=dh2YkDBdTZ21Cdrr9w7PQA%3D%3D&fcc_id=SS3-DGN12" target="_blank">FCC filings</a>, it appears DJI was able to get the Lito approved before the December 22, 2025, cutoff for the FCC ban. This means the new drone is "grandfathered" into the US market and can be sold in the US.</p><h2 id="what-is-dji-lito">What is DJI Lito?</h2><p>DJI's official teaser only highlighted the name and official launch date. However, some previous leaks revealed images that purported to be the new compact drone. </p><p>Earlier this month, "tech detective" Igor Bogdanov<a href="https://x.com/Quadro_News/status/2039951432846082443" target="_blank"> showed photos</a> that look like marketing materials and not just CAD renders or dummy models. He also <a href="https://x.com/Quadro_News/status/2040874012461404520" target="_blank">posted some packaging images</a>. Today, in light of the announcement, he <a href="https://x.com/Quadro_News/status/2044093551563129050" target="_blank">posted some zoomed in</a> looks at the drone.</p><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">👉Well, well, well, what's this in my hands. The new DJI Lito🤭#djilito1 #djilitox1 pic.twitter.com/fp8tgxORBD<a href="https://twitter.com/cantworkitout/status/2039951432846082443">April 3, 2026</a></p></blockquote><div class="see-more__filter"></div></div><p>A<a href="https://www.reddit.com/r/dji/comments/1sae4ai/dji_lito_1_and_lito_x1/" target="_blank"> separate leak on Reddit</a> appears to reveal some specs of the Lito drone. According to the poster, the Lito has a top speed of 18m/s and an apparent incompatibility with current controllers.</p><p>Based solely on Igor's images, the Lito looks a lot like the<a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review"> DJI Mini 5 Pro</a>, if perhaps a bit sleeker. It's not clear where it will fit in the DJI lineup. My speculation is that the Lito is a slightly less feature-rich version of the Mini.</p><h2 id="how-we-got-here">How we got here</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2h3muDgz4HntnDRUn9mpcL" name="DJI Flip - Hero" alt="DJI Flip - Hero" src="https://cdn.mos.cms.futurecdn.net/2h3muDgz4HntnDRUn9mpcL.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" 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 mentioned, the FCC implemented a ban on foreign-made drones in December of last year, specifically targeting Chinese manufacturers. DJI has been fighting the ban since at least 2023 and <a href="https://www.tomsguide.com/cameras-photography/drones/fcc-exceeded-its-statutory-authority-claims-dji-in-lawsuit-to-overturn-drone-ban">sued the FCC</a> in February claiming the agency "exceeded its statutory authority" in an attempt to overturn the ban.</p><p>You can <a href="https://www.tomsguide.com/cameras-photography/drones/dji-drones-still-available-to-buy-usa-february-26">still buy DJI-made drones</a> in the US, especially grandfathered in ones that were made before the December deadline. Everything else has been or will be added to the FCC's "Covered List" or its list of banned devices.</p><p>Technically, DJI could possibly release more drones in the US after <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">passing "rigorous cyber and hardware assessments,"</a> according to the <a href="https://www.fcc.gov/files/nsd-fcc-covered-list-waiver-0126" target="_blank" rel="nofollow">NSD FCC Covered List Waiver 0126</a>. However, it's not clear what those assessments include and if they'll be made difficult just to keep drones on the Covered List.</p><p>The legal battles are ongoing, so it may be some time before this is totally cleared up. But for now, the Lito is coming and could be the last new DJI drone we see for a while.</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/cameras-photography/drones/i-test-drones-for-a-living-heres-what-i-think-of-reddits-top-recommendations-for-beginners">I test drones for a living — here’s what I think of Reddit’s top recommendations for beginners</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/my-top-rated-drones-for-the-summer">Summer is the best time for aerial photography — here are my top-rated drones for the perfect shots</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-versus-antigravity-a1-clear-winner">I've flown both the DJI Avata 360 and the Antigravity A1 360-degree drones — and there's a clear winner</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Summer is the best time for aerial photography — here are my top-rated drones for the perfect shots ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/my-top-rated-drones-for-the-summer</link>
                                                                            <description>
                            <![CDATA[ As the days get longer and brighter, now is the perfect time to grab a drone and take to the skies. Here are my top 7 recommendations, tested by yours truly. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">24KbcnqZ9RXpsbLAFhLcDf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/egtHVEPeGMqebCydWNE9pW-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 29 Mar 2026 09:15:00 +0000</pubDate>                                                                                                                                <updated>Mon, 30 Mar 2026 15:07:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/egtHVEPeGMqebCydWNE9pW-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Mini 4 Pro.]]></media:description>                                                            <media:text><![CDATA[DJI Mini 4 Pro.]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Mini 4 Pro.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/egtHVEPeGMqebCydWNE9pW-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Ah, summer. Winter has long gone and with it, the snow has melted away. The cherry blossoms and magnolia trees are blossoming everywhere, and as the clocks change in the States and in Europe, it signals one thing: summer will soon be here. It's time for barbecues in the backyard and staying out late as it's brighter for longer. It's also a great time for photography, so it's time to dust off your <a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">camera</a>.</p><p>You know what else is perfectly suited to summer? Drones and aerial photography. As someone who tests all the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a>, I know for a fact that it can be very difficult to capture pleasing footage in the winter when everything appears dry and damp — especially if you live in the U.K. like I do.</p><p>If you're planning on taking to the skies this summer, boy have I got some good recommendations for you! As part of the <a href="https://www.tomsguide.com/live/news/best-amazon-big-spring-sale-2026-deals-home-apparel-tech">Amazon Big Spring Sale</a>, many of my favorite drones have been discounted, such as the <a href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K/" target="_blank" rel="nofollow">DJI Mini 5 Pro Fly More Combo which is a whopping $500 off at Amazon</a>, and the <a href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow">Potensic Atom 2 bundle which is 21% off at Amazon</a>.</p><p>Two of my top-rated drones, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review">DJI Air 3S</a>, aren't discounted but they're worth paying full price for — I gave both of them 4.5-star ratings. So, if you're looking to capture beautiful, sun-kissed landscapes this summer, here are the drones that are up to the challenge.</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong>DJI Mini 5 Pro Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K/" target="_blank" rel="nofollow"><strong>was $1,599 now $1,099 @ Amazon</strong></a></li><li><strong>DJI Mini 4K Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Stabilization-Transmission-Batteries-QuickShots/dp/B0CXJCXN17/" target="_blank" rel="nofollow"><strong>was $449 now $309 @ Amazon</strong></a></li><li><strong>DJI Flip: </strong><a href="https://www.amazon.com/gp/aw/d/B0DJ1H6KCP/" target="_blank" rel="nofollow"><strong>was $439 now $349 @ Amazon</strong></a></li><li><strong>DJI Mavic 4 Pro Fly More Combo: </strong><a href="https://www.adorama.com/dji-mavic-4-pro-drone-fly-more-combo-rc-2/p/djimavic4pfm" target="_blank" rel="nofollow"><strong>was $2,899 now $2,849 @ Adorama</strong></a></li><li><strong>DJI Neo 2: </strong><a href="https://www.amazon.com/DJI-Transmission-Transceiver-Beginners-Batteries/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><strong>$259 @ Amazon</strong></a></li><li><strong>DJI Air 3S Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Controller-Wide-Angle-Omnidirectional-Batteries/dp/B07FVXWFDZ/" target="_blank" rel="nofollow"><strong>$1,399 @ Amazon</strong></a></li><li><strong>Potensic Atom 2 Fly More Combo: </strong><a href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow"><strong>was $479 now $379 @ Amazon</strong></a></li></ul><h2 class="article-body__section" id="section-my-top-rated-drones-for-the-summer"><span>My top-rated drones for the summer</span></h2><div class="product"><a data-dimension112="319be09b-93b3-468b-a6fe-5441bac06047" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$1099" href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K/" 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:80.53%;"><img id="kdYGJWAztUs2zozBMcEBXb" name="M5P-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kdYGJWAztUs2zozBMcEBXb.jpg" mos="" align="middle" fullscreen="" width="1500" height="1208" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review" data-dimension112="319be09b-93b3-468b-a6fe-5441bac06047" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$1099">DJI Mini 5 Pro</a> sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor.<a class="view-deal button" href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K/" target="_blank" rel="nofollow" data-dimension112="319be09b-93b3-468b-a6fe-5441bac06047" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$1099">View Deal</a></p></div><div class="product"><a data-dimension112="95f76caa-add1-49d1-870c-3e1f41d2779b" data-action="Deal Block" data-label="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension48="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension25="$309" href="https://www.amazon.com/DJI-Stabilization-Transmission-Batteries-QuickShots/dp/B0CXJCXN17/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:71.87%;"><img id="6YhxyPMnLKDbwi7Nmm5N48" name="DJI-Mini-4K-combo-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6YhxyPMnLKDbwi7Nmm5N48.jpg" mos="" align="middle" fullscreen="" width="1500" height="1078" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-Transmission-Batteries-QuickShots/dp/B0CXJCXN17/" target="_blank" rel="nofollow" data-dimension112="95f76caa-add1-49d1-870c-3e1f41d2779b" data-action="Deal Block" data-label="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension48="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension25="$309">View Deal</a></p></div><div class="product"><a data-dimension112="34ae306e-2b72-432b-9642-1c26ef372132" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$349" href="https://www.amazon.com/gp/aw/d/B0DJ1H6KCP/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1438px;"><p class="vanilla-image-block" style="padding-top:100.14%;"><img id="ETuF4Lpck8ZdBpTP77vEiU" name="DJI Flip deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ETuF4Lpck8ZdBpTP77vEiU.png" mos="" align="middle" fullscreen="" width="1438" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review" data-dimension112="34ae306e-2b72-432b-9642-1c26ef372132" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$349">DJI Flip</a> is a solid mid-range drone, perfect for those looking to upgrade from older DJI models. It captures detailed 48MP stills in all lighting conditions, and records gorgeous 4K/60fps footage. It’s great for content creators as it features many shooting modes, plus it’s built really well and sports a slick design.<a class="view-deal button" href="https://www.amazon.com/gp/aw/d/B0DJ1H6KCP/" target="_blank" rel="nofollow" data-dimension112="34ae306e-2b72-432b-9642-1c26ef372132" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$349">View Deal</a></p></div><div class="product"><a data-dimension112="8d9cad73-b808-4064-80f3-14036e55f588" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2849" href="https://www.adorama.com/dji-mavic-4-pro-drone-fly-more-combo-rc-2/p/djimavic4pfm" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:85.70%;"><img id="Kvkti4eq8co7VcNrx6QL6k" name="DJIM4P-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Kvkti4eq8co7VcNrx6QL6k.jpg" mos="" align="middle" fullscreen="" width="1000" height="857" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review" data-dimension112="8d9cad73-b808-4064-80f3-14036e55f588" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2849">DJI Mavic 4 Pro</a> is the best consumer drone money can buy right now, period. It improves on its predecessor by introducing 6K/60fps video, 100MP stills powered by a Hasselblad camera, and a brand new RC Pro 2 controller that makes flying a breeze. With a long flight time and 5-star performance across the board, it’s the ideal drone for commercial and personal use.<a class="view-deal button" href="https://www.adorama.com/dji-mavic-4-pro-drone-fly-more-combo-rc-2/p/djimavic4pfm" target="_blank" rel="nofollow" data-dimension112="8d9cad73-b808-4064-80f3-14036e55f588" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2849">View Deal</a></p></div><div class="product"><a data-dimension112="333cf0c9-fcfd-4020-9e75-15c23131382e" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259" href="https://www.amazon.com/DJI-Transmission-Transceiver-Beginners-Batteries/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1066px;"><p class="vanilla-image-block" style="padding-top:73.17%;"><img id="qR2QDyEkqYwvExK2rTT6Qe" name="DJI-Neo-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qR2QDyEkqYwvExK2rTT6Qe.png" mos="" align="middle" fullscreen="" width="1066" height="780" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review" data-dimension112="333cf0c9-fcfd-4020-9e75-15c23131382e" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259">DJI Neo 2</a> is the best budget drone on the market right now, upstaging its predecessor in every way and doing so at (still) a low price point. Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, it makes an already formidable drone a must-have for all pilots.<a class="view-deal button" href="https://www.amazon.com/DJI-Transmission-Transceiver-Beginners-Batteries/dp/B0FJ1S18HF/" target="_blank" rel="nofollow" data-dimension112="333cf0c9-fcfd-4020-9e75-15c23131382e" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259">View Deal</a></p></div><div class="product"><a data-dimension112="b5944f17-b6c3-4e43-864d-82ec14010b72" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1399" href="https://www.amazon.com/DJI-Controller-Wide-Angle-Omnidirectional-Batteries/dp/B07FVXWFDZ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="dvdBuBKqFVm6DVzxaXfGJn" name="DJI-Air-3S-deal-box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dvdBuBKqFVm6DVzxaXfGJn.jpg" mos="" align="middle" fullscreen="" width="2560" height="2560" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review" data-dimension112="b5944f17-b6c3-4e43-864d-82ec14010b72" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1399">DJI Air 3S</a> is an outstanding drone with a dual-camera system that lets aerial videographers and travel photographers capture wide-angle and medium telephoto shots. With a large 1-inch sensor, next-gen obstacle avoidance, 42GB internal storage, and superb low-light performance, this is the best 4K/60fps drone money can buy right now.<a class="view-deal button" href="https://www.amazon.com/DJI-Controller-Wide-Angle-Omnidirectional-Batteries/dp/B07FVXWFDZ/" target="_blank" rel="nofollow" data-dimension112="b5944f17-b6c3-4e43-864d-82ec14010b72" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1399">View Deal</a></p></div><div class="product"><a data-dimension112="0ca2fb63-95e6-42a5-9b5d-143701c91c8e" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$379" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" 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:78.13%;"><img id="QEqNG4iNnxL2KBjVQKhum8" name="Potensic-Atom-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QEqNG4iNnxL2KBjVQKhum8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1172" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review" data-dimension112="0ca2fb63-95e6-42a5-9b5d-143701c91c8e" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$379">Potensic Atom 2</a> is a fantastic drone for budget-conscious pilots. It records smooth 4K/30fps video and captures detailed 48MP stills. It features advanced and accurate AI subject tracking, and comes with a new, easy to use controller and app — it’s also lightweight yet sturdy. This drone gives DJI a serious run for its money.<a class="view-deal button" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow" data-dimension112="0ca2fb63-95e6-42a5-9b5d-143701c91c8e" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$379">View Deal</a></p></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-versus-antigravity-a1-clear-winner">I've flown both the DJI Avata 360 and the Antigravity A1 360-degree drones — and there's a clear winner</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review">DJI Avata 360 review: The undisputed king of 360-degree drones</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2026</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The DJI Avata 360 is the all-in-one creation tool I’ve been waiting for — here’s why ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/the-dji-avata-360-is-finally-here-after-months-of-rumors-i-tested-it-and-trust-me-theres-no-better-drone-on-the-planet</link>
                                                                            <description>
                            <![CDATA[ DJI's latest and first-ever 360-degree is also one of its cheapest, and it's a triumph. 8K/60fps video, 120MP stills, and two ways to fly make it a winner. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">RrrMARLBKdoeveiLLcbxN7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4wNg9ymQbevPrX4Dz5e5Lo-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 28 Mar 2026 07:15:00 +0000</pubDate>                                                                                                                                <updated>Mon, 30 Mar 2026 15:09:31 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4wNg9ymQbevPrX4Dz5e5Lo-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Avata 360 360-degree drone]]></media:description>                                                            <media:text><![CDATA[A DJI Avata 360 360-degree drone]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Avata 360 360-degree drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4wNg9ymQbevPrX4Dz5e5Lo-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When I say, "drones really don't get much better than this," I'm obviously talking about the brand new <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review">DJI Avata 360</a>. DJI has been teasing its latest and first-ever 360° drone for a couple of weeks now, and that's not even the first we've heard of it. Since the tail-end of 2025, <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-latest-rumors-and-leaks-february-2026">online rumors and leaks have been speculating the Avata 360's launch</a>, specs and price, and finally, <em>finally, </em>the drone has landed — and it's made a splash.</p><p>I'll be the first to admit that drones have been... a little boring of late. The same specs recycled and stuffed into the same sub-250g / sub-8.78oz bodies, the drone industry feels like it has plateaued in the last few years. As someone who tests the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a>, I've been wanting someone to shake things up. Make a bang. Make me go, "Wow, they can do that?!" That finally happened when the <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a> came out in November 2025, and while it impressed me, the premium price left a sour taste in my mouth. Enter DJI.</p><div class="product"><a data-dimension112="89ef50b9-52bd-4af8-ba40-cc8d28789bf4" data-action="Deal Block" data-label="DJI Avata 360" data-dimension48="DJI Avata 360" data-dimension25="$549" href="https://www.bhphotovideo.com/c/product/1960290-REG/dji_avata_360_drone.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="fdaGUhiHEJrq3yMANFdyxW" name="Avata-360-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fdaGUhiHEJrq3yMANFdyxW.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review" data-dimension112="89ef50b9-52bd-4af8-ba40-cc8d28789bf4" data-action="Deal Block" data-label="DJI Avata 360" data-dimension48="DJI Avata 360" data-dimension25="$549">DJI Avata 360</a> stakes its claim as the best 360° drone you can buy. Its twin lenses let you capture every angle possible, and footage is captured at 8K/60fps, giving you plenty of headroom in post-production. Straight-out-of-camera 360° clips give it a leg-up over the Antigravity A1, the only other 360° drone at the time of writing, and the videos (and 120MP stills) are packed with detail.<a class="view-deal button" href="https://www.bhphotovideo.com/c/product/1960290-REG/dji_avata_360_drone.html" target="_blank" rel="nofollow" data-dimension112="89ef50b9-52bd-4af8-ba40-cc8d28789bf4" data-action="Deal Block" data-label="DJI Avata 360" data-dimension48="DJI Avata 360" data-dimension25="$549">View Deal</a></p></div><p>The Avata 360 is, in true DJI fashion, a fine drone. It's not only the best 360° drone, it's one of the best drones in general, period. DJI has managed to pack twin lenses that capture 8K/60fps footage and 120MP stills, omnidirectional obstacle avoidance, and next-gen features like Intelligent Tracking into a body that doesn't break the bank. And it certainly gives the Antigravity A1 a run for its money.</p><h2 id="chock-full-of-goodies">Chock-full of goodies</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YvK5opkgEow" allowfullscreen></iframe></div></div><p>While you can read all about the drone's specs in my full <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review">DJI Avata 360 review</a>, I'd like to give you a quick overview of what we're being treated to here. The Avata 360 is fitted with twin lenses that record 4K record a 180° FoV (field of view) each in 4K, and the frames are then stitched together by the camera. What this means is that you get +8K resolution before stitching and when the clips are stitched together, you get 360° footage at true 8K resolution.</p><p>In addition to this, you can capture 120MP stills too, as the twin lenses snap 64MP images each and then stitch them together. The best part is that you can't see any stitching lines, neither in videos nor in stills. Also, if you want to quickly share clips on social media and don't have time for post-production (you'll need to reframe the footage a fair bit in post to make it usable), you can do that and create 'tiny planet' effects by manipulating the two top dials on the RC-2 controller.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DtyupaS6iLc" allowfullscreen></iframe></div></div><p>Speaking of, there are two ways of flying the Avata 360: you can do so with either the RC-2 controller (or any other recent DJI controller, really) or the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3 and the RC Motion 3 controller</a>. Compared to the Antigravity A1 which can be flown only with a headset and motion controller, the dual ways of flying make the Avata 360 far more versatile. Having tested both, you can take my word for it when I say both work extremely well.</p><h2 id="no-qualms-about-the-build">No qualms about the build</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZekRdXSQoi3JbJcYJu5y7" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/ZekRdXSQoi3JbJcYJu5y7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As is always the case with DJI's drones, the DJI Avata 360 is built extremely well and designed just as nicely. Looking like the lovechild of the <a href="https://www.tomsguide.com/cameras-photography/drones/i-flew-the-dji-avata-2-for-an-entire-month-heres-what-i-wish-i-knew-beforehand">DJI Avata 2</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a>, the Avata 360 is wrapped in dark grey colors which lend it a premium edge. The drone features propeller guards which not only make the drone safe for flying indoors or near people, but also protect the propellers if the drone runs into a wall, tree or other obstacle.</p><p>One important thing to note about the Avata 360 is that it weighs 1lb or 455g, which means that you’ll need to register it with the F.A.A. in the U.S. and the C.A.A. in the U.K., or any other governing authority depending on where you live. More restrictions may apply too, so I highly recommend doing your research before taking to the skies. In my opinion, don't let the weight put you off — it's well-worth it. Because it's a little heavy, the Avata 360 doesn't get knocked by sudden gusts of wind either, ensuring you always get smooth and stable footage.</p><p>Alongside the brand's trademark RockSteady technology, the drone also features a single-axis mechanical gimbal which provides further stabilization. None of the footage I captured appeared shaky or unsteady, and even if it does, you can digitally stabilize it via DJI Studio when you're back at your desk.</p><h2 id="so-it-s-perfect">So... it's perfect?</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4d3kep5x4DyJgwMkk39pL4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/N6YSa2MvDNNh4zL7zm8hD4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RJDeY48JDwmu9WJoGQxfH4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/tVhXn8of4ksnBxsmJEN7g3.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/z4rbKKjHG5UGR2pxgZcxC4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>Yeah, it kinda is. Look, my job is to analyze tech and put products through their paces, and I've struggled to find any real flaws with the DJI Avata 360. Okay, it weighs more than 8.78oz, but does that matter in the grand scheme of things, when you're getting such a solid drone? <a href="https://www.bhphotovideo.com/c/product/1960290-REG/dji_avata_360_drone.html" target="_blank" rel="nofollow">U.S. consumers have to wait a while too as the drone is currently available for pre-order only</a>, but again, that's not a flaw. It will come.</p><div class="product"><a data-dimension112="6194f0cb-54ea-42d1-a84a-ee46e30c1dd6" data-action="Deal Block" data-label="If you're in the U.K., you can get the DJI Avata 360 right now for £639 (with the RC-2 controller). There are a couple of bundles available via the link above too: the RC-2 Fly More Combo for £829 and the Motion Fly More Combo was £829." data-dimension48="If you're in the U.K., you can get the DJI Avata 360 right now for £639 (with the RC-2 controller). There are a couple of bundles available via the link above too: the RC-2 Fly More Combo for £829 and the Motion Fly More Combo was £829." data-dimension25="£639" href="https://www.amazon.co.uk/DJI-Imaging-Propeller-Goggles-intuitive/dp/B0FWRMDNGV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="fdaGUhiHEJrq3yMANFdyxW" name="Avata-360-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/fdaGUhiHEJrq3yMANFdyxW.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you're in the U.K., you can get the DJI Avata 360 right now for £639 (with the RC-2 controller). There are a couple of bundles available via the link above too: the RC-2 Fly More Combo for £829 and the Motion Fly More Combo was £829.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Imaging-Propeller-Goggles-intuitive/dp/B0FWRMDNGV/" target="_blank" rel="nofollow" data-dimension112="6194f0cb-54ea-42d1-a84a-ee46e30c1dd6" data-action="Deal Block" data-label="If you're in the U.K., you can get the DJI Avata 360 right now for £639 (with the RC-2 controller). There are a couple of bundles available via the link above too: the RC-2 Fly More Combo for £829 and the Motion Fly More Combo was £829." data-dimension48="If you're in the U.K., you can get the DJI Avata 360 right now for £639 (with the RC-2 controller). There are a couple of bundles available via the link above too: the RC-2 Fly More Combo for £829 and the Motion Fly More Combo was £829." data-dimension25="£639">View Deal</a></p></div><p>Other than that, no, there isn't anything wrong with the Avata 360, and you can rest assured that you're getting bang for your buck. It's some of the most fun I've had flying and testing a drone recently, and the creative possibilities are truly limitless. It's worth every cent.</p><p><em>Wondering which 360° drone is right for you? Check out my </em><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-versus-antigravity-a1-clear-winner"><em>DJI Avata 360 versus Antigravity A1 face-off</em></a><em>!</em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eyzRqW"></div>                            </div>                            <script src="https://kwizly.com/embed/eyzRqW.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/cameras-photography/drones/dji-avata-360-review">DJI Avata 360 review: The undisputed king of 360-degree drones</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-versus-antigravity-a1-clear-winner">I've flown both the DJI Avata 360 and the Antigravity A1 360-degree drones — and there's a clear winner</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/i-tested-the-dji-goggles-n3-for-a-month-and-i-dont-want-to-fly-a-drone-without-an-fpv-headset-ever-again">I tested the DJI Goggles N3 for a month — and I don’t want to fly a drone without an FPV headset ever again</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI Avata 360 review: The undisputed king of 360-degree drones ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review</link>
                                                                            <description>
                            <![CDATA[ The DJI Avata 360 is an exceptional 360-degree drone, boasting 8K/60fps video capabilities, dual ways to fly, hi-res images, and lots more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zktRRFkPscFbEZA7TCp3hd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/b4HLoC8e5MA5dACvMWYTcn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 26 Mar 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Fri, 27 Mar 2026 09:43:31 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/b4HLoC8e5MA5dACvMWYTcn-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Avata 360 360-degree drone]]></media:description>                                                            <media:text><![CDATA[A DJI Avata 360 360-degree drone]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Avata 360 360-degree drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/b4HLoC8e5MA5dACvMWYTcn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For a few years now, it has felt like the evolution of drones has plateaued, with the same specs being fitted into practically every quadcopter out there. That all changed with the introduction of 360° drones in 2025, and DJI has staked its claim as the best 360° drone with the Avata 360. The Chinese giant’s first 360° drone is a winner, and it upstages the Antigravity A1 (rival Insta360’s drone) in more ways than one.</p><p>Capable of recording 8K/60fps footage, the Avata 360 captures every angle possible with its twin lenses, and gives you plenty of headroom to maintain 4K resolution when cropping to 16:9 in post. Intuitive to fly with either the standard controller or a pair of goggles and a motion controller, the straight-out-of-camera footage can even be used without any work in post-production. It captures hi-res 120MP stills too, and the best part? It’s affordable!</p><p>To find out if this is the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drone</a> for you, read my full DJI Avata 360 review.</p><h2 class="article-body__section" id="section-dji-avata-360-review-specs"><span>DJI Avata 360 review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p><strong>DJI Avata 360</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>Starts at $549 / £409</p></td></tr><tr><td class="firstcol " ><p><strong>Flight time</strong></p></td><td  ><p>23 minutes</p></td></tr><tr><td class="firstcol " ><p><strong>FAA/CAA registration</strong></p></td><td  ><p>Required</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>Two</p></td></tr><tr><td class="firstcol " ><p><strong>Image sensor</strong></p></td><td  ><p>1/1.1-inch Square CMOS, 64MP each (120MP stills)</p></td></tr><tr><td class="firstcol " ><p><strong>ISO</strong></p></td><td  ><p>100-25,600 (video) | 100-6400 (stills)</p></td></tr><tr><td class="firstcol " ><p><strong>Shutter speed</strong></p></td><td  ><p>1/30s to 1/8,000s</p></td></tr><tr><td class="firstcol " ><p><strong>Aperture</strong></p></td><td  ><p>f/1.9</p></td></tr><tr><td class="firstcol " ><p><strong>Focus</strong></p></td><td  ><p>1.5m to ∞</p></td></tr><tr><td class="firstcol " ><p><strong>Max video resolution</strong></p></td><td  ><p>8K/60fps | 6K/60fps | 4K/60fps | 2.7K/120fps</p></td></tr><tr><td class="firstcol " ><p><strong>Stabilization</strong></p></td><td  ><p>Single-axis mechanical gimbal + digital stabilization</p></td></tr><tr><td class="firstcol " ><p><strong>Indoor use</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Propellers</strong></p></td><td  ><p>Four</p></td></tr><tr><td class="firstcol " ><p><strong>Max takeoff altitude</strong></p></td><td  ><p>4500m</p></td></tr><tr><td class="firstcol " ><p><strong>Max flight distance</strong></p></td><td  ><p>8.38 miles</p></td></tr><tr><td class="firstcol " ><p><strong>Navigation system</strong></p></td><td  ><p>GPS, Galileo, BeiDou</p></td></tr><tr><td class="firstcol " ><p><strong>Collision avoidance</strong></p></td><td  ><p>Omnidirectional</p></td></tr><tr><td class="firstcol " ><p><strong>Smartphone control</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Internal storage</strong></p></td><td  ><p>Yes, 42GB</p></td></tr><tr><td class="firstcol " ><p><strong>microSD card slot</strong></p></td><td  ><p>Yes, V30 or higher</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>9.69 x 7.83 x 2.19 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1lb / 455g</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-avata-360-review-cheat-sheet"><span>DJI Avata 360 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>DJI’s first-ever 360° drone and the latest addition to the Avata lineup</li><li><strong>Who is it for? </strong>For content creators and anyone who wants to capture every angle, as well as first-person view (FPV) enthusiasts</li><li><strong>How much does it cost? </strong>The DJI Avata 360 starts at ~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$549</a> / <a href="https://store.dji.com/uk/product/dji-avata-360" target="_blank" rel="nofollow">£409</a> and goes all the way up to ~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$1,119</a> / <a href="https://www.amazon.co.uk/DJI-Imaging-Propeller-Goggles-intuitive/dp/B0G4RJB8S7/" target="_blank" rel="nofollow">£829</a></li><li><strong>What do we like? </strong>The build quality, 360° 8K/60fps video, 120MP stills, dual ways to fly, and detailed companion software</li><li><strong>What don’t we like? </strong>The heavy weight</li></ul><h2 class="article-body__section" id="section-dji-avata-360-review-price-availability"><span>DJI Avata 360 review: Price & availability</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rpbZjjZPAMGmwnmhkGtYU" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/rpbZjjZPAMGmwnmhkGtYU.jpg" mos="" align="middle" fullscreen="" width="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>Launched on 26 March 2026, the DJI Avata 360 is the Chinese manufacturer’s first-ever 360° drone, and the latest addition to the Avata lineup. At the time of writing, it’s only the second drone to feature 360° technology, and so, it competes directly with the <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a> ($1,599) which first came out in November 2025.</p><p>The Antigravity A1 uses the same technology found in Insta360’s 360° cameras, and this is also the case with the Avata 360. DJI’s drone builds on the imaging tech used in the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review">DJI Osmo 360</a> camera ($549), and I’ll discuss that more in detail soon. The Avata 360 massively undercuts its primary rival, the Antigravity A1, as it costs a lot less. The drone on its own costs <a href="https://www.dji.com/" target="_blank" rel="nofollow">~$549</a> / <a href="https://store.dji.com/uk/product/dji-avata-360" target="_blank" rel="nofollow">£409</a> and is perfect for those who already own a DJI controller. If you want the DJI RC-2 controller, it’ll cost you ~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$859</a> / <a href="https://www.amazon.co.uk/DJI-Imaging-Filming-Propeller-control/dp/B0FWRMDNGV/" target="_blank" rel="nofollow">£639</a>, while both the RC-2 Fly More Combo and the Motion Combo (including the DJI Goggles N3 and the DJI RC Motion 3 controller) retail for ~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$1,199</a> / <a href="https://www.amazon.co.uk/DJI-Imaging-Propeller-Goggles-intuitive/dp/B0G4RJB8S7/" target="_blank" rel="nofollow">£829</a> each. U.S. pricing is yet to be confirmed.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="b4HLoC8e5MA5dACvMWYTcn" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/b4HLoC8e5MA5dACvMWYTcn.jpg" mos="" align="middle" fullscreen="" width="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>That’s right: the Avata 360’s most expensive bundle costs much less than the Antigravity A1’s cheapest one ($1,599 / £1,219). This, alone, makes the Avata 360 a much better investment, and when you add all the goodies it offers to the equation, there’s no question about which drone offers better value for money.</p><p>However, as with all other recent DJI launches, the Avata 360’s U.S. availability is dicey. That’s due to the <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">restrictions on foreign-made drones by the F.C.C.</a> While drones that were registered with the F.C.C. prior to the <a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">23 December 2025 ruling</a> can be sold in the American market — and there are very strong rumors that the Avata 360 was one of them — it’s difficult to ascertain how it will impact the Avata 360’s launch. We also don’t know if DJI Care Refresh will be available for the Avata 360 yet, but I have reached out to a DJI representative to get a clearer picture.</p><h2 class="article-body__section" id="section-dji-avata-360-review-design"><span>DJI Avata 360 review: Design</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FQYdm7S3NNSexVfo9u3ANo" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/FQYdm7S3NNSexVfo9u3ANo.jpg" mos="" align="middle" fullscreen="" width="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 DJI Avata 360, like every other DJI drone I’ve tested, is exceptionally built and designed. As part of the Avata lineup, it borrows design cues from the <a href="https://www.tomsguide.com/cameras-photography/drones/i-flew-the-dji-avata-2-for-an-entire-month-heres-what-i-wish-i-knew-beforehand">DJI Avata 2</a> ($409) as well as the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a> ($319) — it looks like the lovechild of the two. Twin lenses sit on the top and bottom of the gimbal unit to capture a 360° view which can later be edited in post-production via the companion software (more on that soon).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BYY3AtJWv4J3DUtPLeikR" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/BYY3AtJWv4J3DUtPLeikR.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Similar to the Neo 2, the Avata 360 is wrapped in dark grey colors which lend it a premium edge and make it look more high-quality than, say, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review">DJI Neo</a> ($199) or the <a href="https://www.tomsguide.com/reviews/5-things-i-like-about-the-dji-mini-4-pro-and-2-things-i-hate">DJI Mini 4 Pro</a> ($759), in my opinion. Just like on the Neo 2 and the Avata 2, bumpers protect the Avata 360’s four propeller guards, which not only make the drone safe for flying indoors or near people, but also protect the propellers if the drone runs into a wall, tree or other obstacle. Bumper guards are absent on the Antigravity A1, in comparison, which gives the Avata 360 a leg-up — more safety features are always welcome!</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="feph7DiqJrGBjKNwF6cQ7o" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/feph7DiqJrGBjKNwF6cQ7o.jpg" mos="" align="middle" fullscreen="" width="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 Avata 360 weighs 1lb or 455g, and it measures 9.69 x 7.83 x 2.19 inches. Though it isn’t as small as, say, the DJI Neo 2, the Avata 360 is still easy to travel with, especially in the included shoulder bag. As the drone weighs more than 8.78oz, you’ll need to register it with the F.A.A. in the U.S. and the C.A.A. in the U.K., or any other governing authority depending on where you live. The Avata 360’s heavy weight comes as no surprise, given that the DJI Avata 2 weighs 13.3oz or 377g. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T7fvrS5ibB5kniXseJWvRo" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/T7fvrS5ibB5kniXseJWvRo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As with most 360° cameras, the Avata 360’s lenses are easily replaceable by users, which is good news as the lower lens can be liable to impacts during landing. This is simple enough to do, as all you need to do is unscrew and pop out the damaged lens with the tools provided in the replacement kit, and screw on the new one.</p><p>We’ve also seen the inclusion of interchangeable lenses with the Antigravity A1, so it’s great that DJI has implemented this feature too. To ensure that the lenses don’t get damaged, the Avata 360’s gimbal rotates in a way that the lenses are only exposed when the drone is turned on. When you’re landing the drone, the gimbal rotates and tucks what would be the lower lens to the back, so that it doesn’t come in contact with the ground.</p><p>Build quality remains sublime as usual, and the Avata 360 doesn’t feel low-quality. Tapping it with my fingernails didn’t reveal any hollow parts or pinging, so you’re getting bang for your buck.</p><h2 class="article-body__section" id="section-dji-avata-360-review-controls"><span>DJI Avata 360 review: Controls</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VaHdqRWtQH2eXVrKTRpHfn" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/VaHdqRWtQH2eXVrKTRpHfn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When you buy the Antigravity A1, you get Vision goggles and a Grip motion controller in the bundle, and that’s what you use to fly the drone — similar to the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3 and the DJI RC Motion 3</a> controller ($229 + $99). The DJI Avata 360 is a more versatile drone in that regard, as you can fly it with either the Goggles N3 and the RC Motion 3, or with a DJI RC-2 controller.</p><p>I’ve covered the RC-2 controller extensively as I’ve used it with the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> ($759) and other drones, but with the Avata 360, the interface is a little different. For instance, when using the RC-2 with the Avata 360, the top left dial lets you adjust the 360° Virtual Gimbal’s tilt and roll angle while the top right dial zooms in and out to help you capture each and every angle. When you’re doing this while flying the drone, it feels a little trippy and disorienting, but it’s extremely fun.</p><p>One of the advantages of buying the Avata 360 over the Antigravity A1 is the RC-2 controller — it can even be flown with an RC-N3 controller — as it enables you to view the footage you’ve just shot. You don’t need to wait until you’ve offloaded the footage to your phone or when you’re back at your desk. You can view a low-res preview of the video you’ve just filmed, and you can even use your finger to change the on-screen viewing angles. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NMmWhT39D2JcubNyvAwPJi" name="DJI_Goggles_N3_03.JPG" alt="A person wearing the DJI Goggles N3 FPV headset in a dary gray colorway and holding a DJI RC Motion 3 controller" src="https://cdn.mos.cms.futurecdn.net/NMmWhT39D2JcubNyvAwPJi.jpg" mos="" align="middle" fullscreen="" width="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>Then you’ve got the Goggles N3 and the RC Motion 3, which I also tested with the Avata 360. If you want a more immersive flying experience, I’d highly recommend grabbing that bundle instead, as it makes you feel like you’re sitting on top of the drone, and it gives you a proper bird’s eye view of the world. You can see all around you by simply moving your head. Look down and you’ll see what’s under the drone. Look to the right and you’ll see what’s to the right of the Avata 360. This is also how the Antigravity A1’s Vision goggles and Grip controller work. Both the Avata 360 and the Antigravity A1 are very similar in this regard.</p><p>The RC Motion 3 works just as well, and gives you a lot of control over the Avata 360’s movements. It enables you to make minute adjustments to your drone’s position and direction, so you can turn tight corners with ease. To find out more about how FPV flying works, read my full <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3 review</a>.</p><p>If you don’t want to spend nearly a grand on the Motion combo, the standard RC-2 bundle will be enough for you. 360° footage needs to be edited in post-production to make it usable and the RC-2 controller captures every angle anyway, so you don’t necessarily need the most expensive bundle.</p><h2 class="article-body__section" id="section-dji-avata-360-review-features"><span>DJI Avata 360 review: Features</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZekRdXSQoi3JbJcYJu5y7" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/ZekRdXSQoi3JbJcYJu5y7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s no dearth of features on the DJI Avata 360. Alongside its 8K 360° video capabilities, you also get solid wind resistance, omnidirectional obstacle avoidance, and other safety features. For a retail price much less than the Antigravity A1, I’d say the Avata 360 trumps Insta360 in the features department.</p><p>The Avata 360 has a flight distance of 8.38 miles, which is a little more than the Antigravity A1’s 8-mile distance when you’re using a standard flight battery. On the Antigravity A1, this doubles with a High-Capacity battery. On the right edge of the drone, you’ll find a microSD card slot. While you get 42GB of internal storage (versus just 20GB on the Antigravity A1), I’d highly recommend investing in a microSD card, such as the Lexar 256GB V60 (<a href="https://www.amazon.com/Lexar-Professional-Cameras-Portable-LMSGOLD256G-BNNNG/dp/B0CL8394GR/" target="_blank" rel="nofollow">$134</a>). If you’re constantly shooting 8K/60fps video, the Avata 360’s internal storage will fill up extremely quickly — any drone’s or camera’s would.</p><h2 id="wind-resistance">Wind resistance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mwstMHnpMagP8YvPUJ3MT" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/mwstMHnpMagP8YvPUJ3MT.jpg" mos="" align="middle" fullscreen="" width="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 Avata 360 features great wind resistance, capable of withstanding level 5 winds (10.7 m/s or 24mph). This is the same as the Antigravity A1 and the DJI Avata 2. I flew on a couple of windy days when the speed was over 20mph, according to my phone, and the drone didn’t falter. Because it weighs 1lb as well, it isn’t susceptible to gusts of wind — something that is an issue with sub-250g drones, like the Antigravity A1.</p><h2 id="obstacle-avoidance">Obstacle avoidance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TobsV5mwwbjPzmGbmkLZzn" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/TobsV5mwwbjPzmGbmkLZzn.jpg" mos="" align="middle" fullscreen="" width="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 Avata 360 features fantastic obstacle avoidance too. Its omnidirectional obstacle avoidance means it can brake or bypass objects in its way, depending on your settings. This is one of the most important features you can have in an FPV drone, and it comes in handy especially when flying the Avata 360 through the Goggles N3 and using the RC Motion 3. It gives you a lot more confidence when navigating tight spaces.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nZ53rPfauXynPDhfHEuXQo" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/nZ53rPfauXynPDhfHEuXQo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It will continue detecting and avoiding obstacles even when you hit the return-to-home button. This prompts the drone to fly back to its last known takeoff position, and is automatically toggled when the Avata 360 is low on battery.</p><h2 class="article-body__section" id="section-dji-avata-360-review-video-quality"><span>DJI Avata 360 review: Video quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4wNg9ymQbevPrX4Dz5e5Lo" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/4wNg9ymQbevPrX4Dz5e5Lo.jpg" mos="" align="middle" fullscreen="" width="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 DJI Avata 360 is an incredible 360° drone, capable of recording 8K video at 60fps, which gives it a leg-up over the Antigravity A1 whose frame rate tops out at 30fps. While the Avata 360 borrows much of its core technology from the DJI Osmo 360, it’s important to note that the action camera’s 8K video is limited to 50fps (which is also outstanding, by the way) or 5K at 60fps. It does, however, feature the same 1/1.1-inch Square CMOS sensor.</p><p>Just like on the action camera, the Avata 360’s twin lenses record a 180° FoV (field of view) each in 4K, and the frames are then stitched together by the camera. What this means is that you get +8K resoltuion before stitching and when the clips are stitched together, you get 360° footage at true 8K resolution. This is how the twin lenses on the Antigravity A1 work too. I couldn’t see any stitching lines between the clips either, even after I zoomed in and analyzed the clips (and stills).</p><p>8K/60fps is extremely smooth and stable, and gives you a lot of freedom in post-production. You’ll be relying on companion software for editing these files in post (more on that soon), and 8K resolution basically gives you enough headroom in post-production to facilitate reframing (cropping into that full 8K image) at up to 4K in a 16:9 aspect ratio, depending on how wide the field of view is of your final frame.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YvK5opkgEow" allowfullscreen></iframe></div></div><p>But the Avata 360 has an ace up its sleeve. You see, when you’re shooting video on the Antigravity A1, you can’t really zoom out and change the pitch angle much, so you need to heavily edit files in post to make them watchable and usable. On the Avata 360? Even without editing, you can create ‘tiny planet’ effects by manipulating the two top dials on the RC-2 controller, as you can see above. I haven’t edited the footage (except for trimming the beginning and the end) and it still looks fantastic, giving the viewer a bird’s eye view of the world.</p><p>I think this massively adds to the Avata 360’s appeal. 360° editing software can take a while to get to grips with and might not be everyone’s cup of tea, and if a novice can create footage that’s instantly usable and shareable, it’s a win.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DtyupaS6iLc" allowfullscreen></iframe></div></div><p>But editing 360° footage via companion software is necessary if you want longer clips that aren’t simply using effects. It can be a lot of fun, and I’ll discuss the software in detail soon. I edited the video above to add a few different effects, such as Asteroid, Ultra Wide and more, and adjusted the FoV, pan, tilt and roll angles to create a trippy video.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Vbs49bXpD5k" allowfullscreen></iframe></div></div><p>Similar to Deep Track on the Antigravity A1, the Avata 360 features Intelligent Tracking where you can draw a box around a subject in post-production, and the drone will automatically track it and highlight it as the primary subject. As you can see in the video above, I drew a box around a pillar in the distance on two separate occasions, and the software did an excellent job of tracking it even as the Avata 360 was moving.</p><p>Since the Avata 360 records every single angle, you can swap between different FoVs — forward, behind, above, below, and so on — which essentially gives you unlimited A and B cams. It increases creative capabilities by enabling you to capture otherworldly angles which isn’t necessarily possible on non-360° drones. You also get access to DJI’s range of QuickShot Intelligent Flight modes, such as Dronie, Rocket, Follow, etc.</p><p>Like DJI’s action cameras, the Avata 360’s footage is stabilized using the brand’s trademark RockSteady technology, so every clip turns out smooth, as you’ve seen in all the footage above. Alongside this, the drone also features a single-axis mechanical gimbal which provides some degree of stabilization. Using both together, the Avata 360’s footage never flickers or appears unsteady.</p><h2 class="article-body__section" id="section-dji-avata-360-review-image-quality"><span>DJI Avata 360 review: Image quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jGQfqSc7xd5XDHiB6ActQo" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/jGQfqSc7xd5XDHiB6ActQo.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alongside stellar video quality and capabilities, the DJI Avata 360 is exceptional at capturing stills too. Each lens on the Avata 360 captures 64MP stills which are then digitally stitched together to deliver a 120MP 360° photo (15520×7760). I couldn’t see any visible stitching lines in the photos I’d captured for the purposes of this review. The 360° photo means you can edit it as you wish, and view every single angle if you share it with another person as an interactive 360° photo.</p><p>If you’re short on space and don’t want massive 120MP files clogging up your internal storage or microSD card, you can drop the resolution down to 30MP. You won’t capture as much detail, of course, but it’s a good idea if you’re in a pinch.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4d3kep5x4DyJgwMkk39pL4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/N6YSa2MvDNNh4zL7zm8hD4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RJDeY48JDwmu9WJoGQxfH4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/z4rbKKjHG5UGR2pxgZcxC4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/tVhXn8of4ksnBxsmJEN7g3.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>The 1/1.1-inch sensor captures plenty of detail with faithful color reproduction, as you can see in the gallery above. The highlights and shadows are well-balanced while the images themselves are highly detailed, and you can zoom in and not lose too much detail either.</p><p>These were taken in Auto mode but you can shoot manually too, as the Avata 360 has an adjustable shutter speed of 1/30s to 1/8,000s and ISO range of 100-6400 when shooting stills. This is the same ISO range you’ll find on the Antigravity A1, and should be <em>just</em> enough to shoot in low-light conditions, such as at dusk or dawn.</p><h2 class="article-body__section" id="section-dji-avata-360-review-app-software"><span>DJI Avata 360 review: App & software</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/LLhNEjGMdP7yhoA3YPnZTQ.jpg" alt="DJI Avata 360 editing software screenshots" /><figcaption><small role="credit">DJI / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/C6isQebv6KCPcw7efrMTRQ.jpg" alt="DJI Avata 360 editing software screenshots" /><figcaption><small role="credit">DJI / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Lree6EX6fvSuCjEufn3eQQ.jpg" alt="DJI Avata 360 editing software screenshots" /><figcaption><small role="credit">DJI / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9TieA4NKVNTJngBWvV34RQ.jpg" alt="DJI Avata 360 editing software screenshots" /><figcaption><small role="credit">DJI / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/BfBhfusmdUzA259LgFREPQ.jpg" alt="DJI Avata 360 editing software screenshots" /><figcaption><small role="credit">DJI / Tom's Guide</small></figcaption></figure></figure><p>The DJI Avata 360 saves 360° files in the OSV format which must be opened in either <a href="https://www.dji.com/uk/downloads/djiapp/dji-fly" target="_blank" rel="nofollow">DJI Fly</a> on your smartphone or <a href="https://www.dji.com/uk/downloads/softwares/dji-studio" target="_blank" rel="nofollow">DJI Studio</a> on your macOS or Windows machine. Both apps are extremely easy to use and I’ll discuss both, starting off with DJI Studio. Full disclosure: this was my first time using DJI Studio, and as a newbie, I thoroughly enjoyed using the software thanks to its user-friendly interface.</p><p>DJI Studio gives you quick tutorials on how to edit 360° footage, so even if you’re a newcomer like myself, you won’t have any trouble getting a hang of it. It might take a while to understand keyframes and effects but once you wrap your head around them, editing the Avata 360’s footage is a walk in the park. Within DJI Studio, you can adjust pan, tilt, roll angles, FoVs, add effects like Asteroid, and lots more. You can also color grade your footage in the app itself, if you’ve shot it in D-Log M. If you shoot in MP4, you can adjust the contrast, brightness, color temperature, etc. Easy as pie.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/bprfnPwNvhvY2yp5FtJkWQ.jpg" alt="DJI Avata 360 editing software screenshots" /><figcaption><small role="credit">DJI / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/PqhaBZWzPSXv5VtENeaKTQ.jpg" alt="DJI Avata 360 editing software screenshots" /><figcaption><small role="credit">DJI / Tom's Guide</small></figcaption></figure></figure><p>There are a few handy editing features for smoother or creative results too, such as Chromatic Aberration Control, Stitching Optimization, Distortion Optimization, and Motion Blur. You get a fair bit of control over the motion blur which can help convey a sense of high speed if you so wish.</p><p>Then you’ve got DJI Fly on Android and iOS, which serves as the central hub for all your DJI drones. As with other DJI drones, you can use this app to quickly offload footage (useful if you’re running out of space), see nearby fly spots, and update the drone’s firmware.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/RtCsQROLdAY" allowfullscreen></iframe></div></div><p>In addition to all of this, you can also edit your 360° footage, and I especially love the One Tap Edit feature, which utilizes AI to trim your selected clips and add effects and music to them, as you can see in the video above. You get several templates to add your clips, text and music to too, and it’s all you need to create quick footage to share instantly on social media.</p><h2 class="article-body__section" id="section-dji-avata-360-review-battery-life"><span>DJI Avata 360 review: Battery life</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rj7qHdR2ztfLNvVSRAfvDo" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/rj7qHdR2ztfLNvVSRAfvDo.jpg" mos="" align="middle" fullscreen="" width="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 DJI Avata 360 has respectable battery life, at least by drone standards. On a single charge, the Avata 360 can fly for 23 minutes, which is the same as the DJI Avata 2. The Antigravity A1, in comparison, can fly for 24 minutes using a standard battery pack or 39 minutes when using a High-Capacity battery.</p><p>Of course, the battery life will depend on the usage and flying conditions. I flew the Avata 360 for approximately 22 minutes while shooting 8K/60fps video before the drone had to automatically return-to-home due to low battery. This is fantastic, in my opinion, but also worth noting that it’s entirely subjective, as I was flying in windless conditions and in Neutral mode.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FsiViCoJvvhawvxoPbe6L" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/FsiViCoJvvhawvxoPbe6L.jpg" mos="" align="middle" fullscreen="" width="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 Avata 360 comes with a three-way charging hub and two extra batteries if you buy the Fly More combo. All three batteries, in my testing, took just over an hour to go from zero to 100% charge.</p><h2 class="article-body__section" id="section-dji-avata-360-review-verdict"><span>DJI Avata 360 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WxLMSEqJdwhdR3HpWJK3W" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/WxLMSEqJdwhdR3HpWJK3W.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you’re a fan of aerial photography and want to capture every angle possible, there’s no better 360° drone better than the DJI Avata 360. It’s super easy and intuitive to fly with either the DJI Goggles N3 or a standard DJI RC-2 / RC-N3 controller. Since it captures every angle, you can focus on and enjoy flying and think about framing later. Both the DJI Studio and DJI Fly apps are easy to use and enable you to create stunning (and even trippy) footage.</p><p>The Avata 360 captures beautiful, stable 8K/60fps footage and highly detailed 120MP stills. With good battery life, excellent stabilization, and a premium build that doesn’t get knocked about by gusts of wind, the Avata 360 is all you need to get creative and create professional-looking footage. And the best part is that the drone is extremely affordable, and none of the bundles break the bank. It’s the undisputed king of 360° drones.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've flown both the DJI Avata 360 and the Antigravity A1 360-degree drones — and there's a clear winner ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-versus-antigravity-a1-clear-winner</link>
                                                                            <description>
                            <![CDATA[ Both the DJI Avata 360 and the Antigravity A1 are excellent 8K 360-degree drones, and they enable you to get really creative. But one is better than the other. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2ykAEmc4hoHoLyKypWtp9n</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Fim3tqct8EtJKDAtrtzc9Z-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 26 Mar 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 13:57:17 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Fim3tqct8EtJKDAtrtzc9Z-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Antigravity A1 versus DJI Avata 360]]></media:description>                                                            <media:text><![CDATA[Antigravity A1 versus DJI Avata 360]]></media:text>
                                <media:title type="plain"><![CDATA[Antigravity A1 versus DJI Avata 360]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Fim3tqct8EtJKDAtrtzc9Z-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In November of 2025, there was a seismic shift in the drone world: a new brand threatened DJI's position as the king of the skies. Antigravity, a brand "incubated" by Insta360 (yes, the 360° cameras giant), launched its first drone, and the world's first-ever 360° drone, called the <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a>. </p><p>At the time, DJI didn't have its own 360° drone which meant that Antigravity had carved a niche of its own and the A1 remained the undisputed best 360° drone... until now.</p><p>Four months later, in March 2026, DJI launched its first-ever 360° drone (and the world's second), the long-rumored <a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-review">DJI Avata 360</a>. Since there are only two 360° drones in existence, at the time of writing, and both come from two of the biggest names in the realm of action cameras and drones, I naturally had to pit them against one another.</p><p>While I initially thought there weren't many differences between the two, I have since been proven wrong. Both the Avata 360 and the Antigravity A1 shoot 8K 360° video which can be edited in post, and since every single angle is captured, you can focus on and enjoy flying first and think about framing later. Battery lives are fairly similar too... so are there any substantial differences? And is there a clear winner? Yes and yes. </p><p>Here's how it went when I tested the DJI Avata 360 versus the Antigravity A1.</p>        <div class="featured_product_block featured_block_versus" data-id="95277863-9bfc-46ec-935a-3d02428d839f">            <a href="https://www.dji.com/" data-model-name="Avata 360" 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/fdaGUhiHEJrq3yMANFdyxW.jpg" alt="DJI Avata 360"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>DJI</div>                    <div class="featured__title">Avata 360</div>                                    </div>                <div class="subtitle__description">                                <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>                                        <p><p>The DJI Avata 360 stakes its claim as the best 360° drone you can buy. Its twin lenses let you capture every angle possible, and footage is captured at 8K/60fps, giving you plenty of headroom in post-production. Straight-out-of-camera 360° clips give it a leg-up over the Antigravity A1, the only other 360° drone at the time of writing, and the videos (and 120MP stills) are packed with detail. The drone is extremely easy to fly with either goggles or a standard controller, and unlike its primary competition, the Avata 360 does so without breaking the bank.</p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_versus" data-id="96b51360-5b8d-4762-a54e-7b52aeacda1e">            <a href="https://www.amazon.com/Antigravity-Immersive-Beginners-Obstacle-Avoidance/dp/B0G6WRQNQL/" data-model-name="A1" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:70.81%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/NGdR9g2gcxuLzKBw6dG9Nh.jpg" alt="Antigravity A1"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                                            <div class='featured__brand'>Antigravity</div>                    <div class="featured__title">A1</div>                                    </div>                <div class="subtitle__description">                                <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>                                        <p><p>The Antigravity A1 is a triumph. It’s the world’s first-ever 360° quadcopter, fitted with tech you’ll find in the Chinese giant’s action and 360° cameras, and it lets you capture every angle possible. Footage is shot in 8K/30fps, enabling you to maintain 4K in 16x9 when reframing in post — and this footage is packed with detail. 55MP stills look great too. Flying the drone is easy (and immersive) with the Vision goggles and Grip controller. But all of this technology comes at a steep, steep price, and I’m not convinced that it’s entirely justified.</p></p>                </div>                            </div>        </div><h2 class="article-body__section" id="section-dji-avata-360-vs-antigravity-a1-specs-compared"><span>DJI Avata 360 vs Antigravity A1: Specs compared</span></h2><div ><table><thead><tr><th class="firstcol " ><p>Specs</p></th><th  ><p>DJI Avata 360</p></th><th  ><p>Antigravity A1</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>Starts at ~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$549</a> / <a href="https://store.dji.com/uk/product/dji-avata-360" target="_blank" rel="nofollow">£409</a></p></td><td  ><p>Starts at <a href="https://www.adorama.com/agde00101.html" target="_blank" rel="nofollow">$1,599</a></p></td></tr><tr><td class="firstcol " ><p><strong>Flight time</strong></p></td><td  ><p>23 minutes</p></td><td  ><p>24 minutes (standard) | 39 minutes (High-Capacity Flight Battery)</p></td></tr><tr><td class="firstcol " ><p><strong>FAA/CAA registration</strong></p></td><td  ><p>Required</p></td><td  ><p>Required if using High-Capacity Flight Battery</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>Two</p></td><td  ><p>Two</p></td></tr><tr><td class="firstcol " ><p><strong>Image sensor</strong></p></td><td  ><p>120MP 1/1.1-inch</p></td><td  ><p>55MP 1/1.28-inch</p></td></tr><tr><td class="firstcol " ><p><strong>ISO</strong></p></td><td  ><p>100-6400 (stills) | 100-25,600 (video)</p></td><td  ><p>100-6400</p></td></tr><tr><td class="firstcol " ><p><strong>Shutter speed</strong></p></td><td  ><p>1/30s to 1/8,000s</p></td><td  ><p>1/8000-1/2s (14MP) | 1/8000-1/20s (55MP)</p></td></tr><tr><td class="firstcol " ><p><strong>Aperture</strong></p></td><td  ><p>f/1.9</p></td><td  ><p>f/2.2</p></td></tr><tr><td class="firstcol " ><p><strong>Focus</strong></p></td><td  ><p>1.5m to ∞</p></td><td  ><p>0.5m to ∞</p></td></tr><tr><td class="firstcol " ><p><strong>Max video resolution</strong></p></td><td  ><p>8K/60fps, 6K/60fps, 4K/60fps, 2.7K/120fps</p></td><td  ><p>8K/30fps, 5.2K/60fps, 4K/100fps</p></td></tr><tr><td class="firstcol " ><p><strong>Stabilization</strong></p></td><td  ><p>Single-axis mechanical gimbal + digital</p></td><td  ><p>Digital only</p></td></tr><tr><td class="firstcol " ><p><strong>Indoor use</strong></p></td><td  ><p>Yes</p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Propellers</strong></p></td><td  ><p>Four</p></td><td  ><p>Four</p></td></tr><tr><td class="firstcol " ><p><strong>Max takeoff altitude</strong></p></td><td  ><p>4500m</p></td><td  ><p>4000m (standard) | 3000m (High-Capacity Flight Battery)</p></td></tr><tr><td class="firstcol " ><p><strong>Max flight distance</strong></p></td><td  ><p>8.38 miles</p></td><td  ><p>8 miles (standard) | 14.3 miles (High-Capacity Flight Battery)</p></td></tr><tr><td class="firstcol " ><p><strong>Navigation system</strong></p></td><td  ><p>GPS, Galileo, BeiDou</p></td><td  ><p>GPS, Galileo, BeiDou</p></td></tr><tr><td class="firstcol " ><p><strong>Collision avoidance</strong></p></td><td  ><p>Omnidirectional</p></td><td  ><p>Omnidirectional</p></td></tr><tr><td class="firstcol " ><p><strong>Smartphone control</strong></p></td><td  ><p>Yes</p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Internal storage</strong></p></td><td  ><p>Yes, 42GB</p></td><td  ><p>Yes, 20GB</p></td></tr><tr><td class="firstcol " ><p><strong>microSD card slot</strong></p></td><td  ><p>Yes, V30 or higher</p></td><td  ><p>Yes, V30 or higher</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>9.69 x 7.83 x 2.19 inches</p></td><td  ><p>12.15 × 15.05 × 3.51 inches (unfolded, with propellers)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>1lb</p></td><td  ><p>8.78oz (standard) | 10.26oz (High-Capacity Flight Battery)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-avata-360-vs-antigravity-a1-price-availability"><span>DJI Avata 360 vs Antigravity A1: Price & availability</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7KEjgsXekY93gWWY7EQGWK" name="Antigravity_A1_ 8.JPG" alt="An Antigravity A1 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/7KEjgsXekY93gWWY7EQGWK.jpg" mos="" align="middle" fullscreen="" width="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 Antigravity A1 is a sub-brand of Insta360 — yes, the action and 360° cameras giant — and it officially launched in November 2025. Four months later, the DJI Avata 360 was announced, becoming the world's second-ever 360° drone (and the Chinese giant's first). I'll start off by talking about the elephant in the room that's desperately wanting to be addressed: the price difference between the DJI Avata 360 and the Antigravity A1.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZekRdXSQoi3JbJcYJu5y7" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/ZekRdXSQoi3JbJcYJu5y7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's a <em>massive </em>price difference between the two, and I wish I was exaggerating but I'm really not. The Avata 360 starts at ~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$549</a> / <a href="https://store.dji.com/uk/product/dji-avata-360" target="_blank" rel="nofollow">£409</a> for just the drone, and this is the perfect deal for those who already own a DJI controller, like the RC-N3 or the RC-2, or a pair of <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3 and a DJI RC Motion 3</a> controller. There are three additional bundles available: with the RC-2 controller (~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$859</a> / <a href="https://www.amazon.co.uk/DJI-Imaging-Filming-Propeller-control/dp/B0FWRMDNGV/" target="_blank" rel="nofollow">£639</a>), an RC-2 Fly More Combo (~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$1,199</a> / <a href="https://www.amazon.co.uk/DJI-Imaging-Propeller-Goggles-intuitive/dp/B0G4RJB8S7/" target="_blank" rel="nofollow">£829</a>), and a Motion Combo (~<a href="https://www.dji.com/" target="_blank" rel="nofollow">$1,199</a> / <a href="https://www.amazon.co.uk/DJI-Imaging-Propeller-Goggles-intuitive/dp/B0G4RJB8S7/" target="_blank" rel="nofollow">£829</a>).</p><p>In comparison, the Antigravity A1 starts at <a href="https://www.adorama.com/agde00101.html" target="_blank" rel="nofollow">$1,599</a> / <a href="https://www.amazon.co.uk/Antigravity-Explorer-Bundle-Batteries-Point/dp/B0G6WRQNQL/" target="_blank" rel="nofollow">£1,219</a>, while its Explorer bundle costs <a href="https://www.adorama.com/agde00102.html" target="_blank" rel="nofollow">$1,899</a> / <a href="https://www.cliftoncameras.co.uk/antigravity-a1-8k-360-drone-explorer-bundle" target="_blank" rel="nofollow">£1,399</a>, and the Infinity bundle retails for a whopping <a href="https://www.adorama.com/agde00103.html" target="_blank" rel="nofollow">$1,999</a> / <a href="https://www.cliftoncameras.co.uk/antigravity-a1-8k-360-drone-infinity-bundle" target="_blank" rel="nofollow">£1,499</a>. It's <em>staggering</em>, and the fact that the Avata 360's most expensive bundle still costs a lot less than the Antigravity A1's cheapest bundle blows my mind.</p><p><strong>Winner: </strong>DJI Avata 360</p><h2 class="article-body__section" id="section-dji-avata-360-vs-antigravity-a1-design"><span>DJI Avata 360 vs Antigravity A1: Design</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FQYdm7S3NNSexVfo9u3ANo" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/FQYdm7S3NNSexVfo9u3ANo.jpg" mos="" align="middle" fullscreen="" width="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>Both the DJI Avata 360 and the Antigravity A1 look very different from one another. The Avata 360 retains the <a href="https://www.tomsguide.com/cameras-photography/drones/i-flew-the-dji-avata-2-for-an-entire-month-heres-what-i-wish-i-knew-beforehand">DJI Avata 2</a>'s design and borrows styling cues from the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a>. It's fitted with propeller guards which means that not only can you fly it indoors, but that its propellers are protected if your drone crashes into a tree or another obstacle. On the other hand, the Antigravity A1 looks similar to drones like the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>, with its propellers exposed, limiting its indoor usage.</p><p>The two drones are fairly compact in size, with the Avata 360 measuring 9.69 x 7.83 x 2.19 inches and the Antigravity A1 measuring 12.15 × 15.05 × 3.51 inches (unfolded, with propellers). Both come with shoulder bags for easy transport. </p><p>The biggest difference lies in their weight. The Avata 360 weighs 1lb while the Antigravity A1 weighs 8.78oz. Because the latter weighs so little, you don't need to necessarily register it with the F.A.A. in the U.S. or the C.A.A. in the U.K., or any other governing authority depending on where you live.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Hi7q6sa7GJNkrkzbmkG5Fn" name="Antigravity_A1_ 1.JPG" alt="Antigravity A1 drone" src="https://cdn.mos.cms.futurecdn.net/Hi7q6sa7GJNkrkzbmkG5Fn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Because the Avata 360 weighs so much, more flight restrictions apply, such as staying under a certain height limit, avoiding flying over groups of people, etc. I'd recommend reading up on the different rules and restrictions depending on where you live or where you're planning on flying the drone. </p><p>Due to the added restrictions, the Antigravity A1 takes the crown when it comes to design and portability — although the Avata 360 won't give you anything to complain about in terms of build quality.</p><p><strong>Winner: </strong>Antigravity A1</p><h2 class="article-body__section" id="section-dji-avata-360-vs-antigravity-a1-features-app"><span>DJI Avata 360 vs Antigravity A1: Features & app</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hn3tF8YqgYWV2uzqWXYMSM" name="Antigravity_A1_ 4.JPG" alt="An Antigravity A1 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/hn3tF8YqgYWV2uzqWXYMSM.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There's no dearth of features on both the DJI Avata 360 and the Antigravity A1. Both drones feature omnidirectional obstacle avoidance, and return-to-home where the drones fly to their last known take-off positions either manually or automatically when battery is low. Both drones also feature internal storage, with the Antigravity A1 packing 20GB of it and the Avata 360 packing 42GB of it, making the latter the winner.</p><p>As is the nature of 360° footage where every single angle is captured, you need to edit footage in post-production to make it usable or professional-looking. Up until recently, DJI's companion software for editing action camera footage was fairly lackluser, but the brand has made massive strides with the Avata 360. DJI Studio on macOS/Windows is the easiest way to edit your footage, and in a similar vein, so is Antigravity Studio. Both drones are also accompanied by clean-looking, user-friendly mobile apps for on-the-fly editing.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VaHdqRWtQH2eXVrKTRpHfn" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/VaHdqRWtQH2eXVrKTRpHfn.jpg" mos="" align="middle" fullscreen="" width="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 biggest difference, and the deciding factor of this round, lies in the drones' straight-out-of-camera footage — and this is also related to how the drones are controlled/flown. The Avata 360 can be used with either the RC-2 or the RC-N3 controller, and you can use these controllers to create Tiny Planet videos that can be shared online without editing. Since the Antigravity A1 uses a screen-less Grip motion controller, the same isn't possible, therefore handing over the win to the Avata 360.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YvK5opkgEow" allowfullscreen></iframe></div></div><p>Also aiding the Avata 360's win in this round is its 42GB of internal storage (compared to just 20GB on the Antigravity A1). In addition to this, the Avata 360's omnidirectional obstacle avoidance, in my opinion, works just a little better than the Antigravity A1's, as seen in my testing.</p><p><strong>Winner: </strong>DJI Avata 360</p><h2 class="article-body__section" id="section-dji-avata-360-vs-antigravity-a1-photo-video-quality"><span>DJI Avata 360 vs Antigravity A1: Photo & video quality</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/AmtCaTg2eWJfM4bCiq3ufE.jpg" alt="An Antigravity A1 360-degree drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TobsV5mwwbjPzmGbmkLZzn.jpg" alt="A DJI Avata 360 360-degree drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Both the DJI Avata 360 and the Antigravity A1 are fantastic, competent drones, capable of capturing 8K 360° footage. The Avata 360 does so at 60fps, while the Antigravity A1 does so at 30fps. The Avata 360 is in fact the only 360° device (action cameras and drones included) to record 8K/60fps footage, so it signals a new age for 360° devices.</p><p> Regardless, both drones capture stable and steady footage but the Avata 360's footage is more stabilized thanks to a single-axis mechanical gimbal working in conjunction with DJI's RockSteady tech.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/HZwkylT5iIQ" allowfullscreen></iframe></div></div><p>8K video shot on both drones gives you enough headroom in post-production to reframe at up to 4K in a 16:9 aspect ratio — the default ratio for YouTube and TV. Twin lenses on each drone basically capture 4K videos which are then stitched together. On the Avata 360, the resolution you get is true 8K and therefore true 4K, and there are no stitching lines visible — in fact, you can't see stitching lines in the footage captured with the Antigravity A1 either.</p><p>The video above was shot on the Antigravity A1, and reframed in post. You can add many effects and adjust every single angle in post-production, and it's like having unlimited A and B cams. The video is smooth and stable, and the colors appear true-to-life too.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DtyupaS6iLc" allowfullscreen></iframe></div></div><p>Above is a video shot on the Avata 360, in comparison. Because of the 60fps frame rate, the footage appears smoother and the motion looks more realistic. Personally, I prefer the look of the Avata 360's footage because the colors look more vibrant and the finer details (like the patterns in the clay) look more hi-res when compared to the Antigravity A1.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/txSdSWjUtHBkUgyWicfP3e.jpg" alt="An aerial photo of Bath, UK, taken on an Antigravity A1 drone" /><figcaption>Taken on an Antigravity A1.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/tGg4SfdXP48VpFNBF9Zwmd.jpg" alt="An aerial photo of Bath, UK, taken on an Antigravity A1 drone" /><figcaption>Taken on an Antigravity A1.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>Alongside shooting video, the Antigravity A1 and the Avata 360 are excellent for capturing aerial stills too. The Antigravity A1 shoots 55MP photos with its 1/1.28-inch sensor while the Avata 360 shoots 120MP photos with its 1/1.1-inch sensor. The 120MP photos are achieved by stitching two 64MP photos together, although there are again no signs or stitching lines in the final results. The Avata 360 also gives you more freedom in terms of cropping when compared to the Antigravity A1 — although 55MP stills are still outstanding.</p><p>The images in the gallery above were shot on the Antigravity A1. They look good, and the drone has captured enough detail in the building in the distance, but some of the finer detail, like the edges of the window panes, has been lost.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4d3kep5x4DyJgwMkk39pL4.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption>Taken on a DJI Avata 360.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/tVhXn8of4ksnBxsmJEN7g3.png" alt="A photo taken on a DJI Avata 360 360-degree drone" /><figcaption>Taken on a DJI Avata 360.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>In comparison, the images in the gallery above were shot on the Avata 360, and again, they look better, in my opinion. The colors are more pleasing to look at, and the images themselves are quite detailed. At the end of the day, the Avata 360 is the drone to get if you want best-in-class image and video quality, and so, it wins this round.</p><h2 class="article-body__section" id="section-dji-avata-360-vs-antigravity-a1-battery-life"><span>DJI Avata 360 vs Antigravity A1: Battery life</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pwGzkUa3xjvZm6ijQpWFTo" name="Antigravity_A1_ 7.JPG" alt="Antigravity A1 charging hub" src="https://cdn.mos.cms.futurecdn.net/pwGzkUa3xjvZm6ijQpWFTo.jpg" mos="" align="middle" fullscreen="" width="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>Neither the DJI Avata 360 nor the Antigravity A1 will give you much room to complain about when it comes to battery life. The Avata 360 is rated for 23 minutes between charges, while the Antigravity A1 is rated for 24 minutes. You can also use High-Capacity flight batteries with the Antigravity A1, and using one bumps the flight time up to 39 minutes, but it's worth noting that this pushes the drone's weight over 8.78oz, which means more restrictions apply.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FsiViCoJvvhawvxoPbe6L" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/FsiViCoJvvhawvxoPbe6L.jpg" mos="" align="middle" fullscreen="" width="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>Both drones are also accompanied by three-way charging hubs — if you buy the respective bundles. These charge three batteries in just under/over an hour each. At the time of writing, it isn't confirmed whether more advanced battery packs will be available for the Avata 360, so the Antigravity A1 is the winner in this department by a very narrow margin.</p><p><strong>Winner: </strong>Antigravity A1</p><h2 class="article-body__section" id="section-dji-avata-360-vs-antigravity-a1-verdict"><span>DJI Avata 360 vs Antigravity A1: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="b4HLoC8e5MA5dACvMWYTcn" name="DJI_Avata_360" alt="A DJI Avata 360 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/b4HLoC8e5MA5dACvMWYTcn.jpg" mos="" align="middle" fullscreen="" width="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>Both the Antigravity A1 and the DJI Avata 360 usher in a new age for drones: the era of 360° drones has begun. They're feats of engineering in their own rights, with both drones boasting incredible 8K video capabilities. But having spent weeks testing both drones, the winner couldn't be more obvious. When it comes to sheer value for money, the Avata 360 takes the cake as its most expensive Fly More Combo costs less than the Antigravity A1's cheapest one.</p><p>But that's not all. The Avata 360 is more intuitive to fly with either a controller or a pair of goggles, and it enables you to create good-looking straight-out-of-camera footage. Furthermore, it packs 8K/60fps video capabilities while the Antigravity A1's caps at 8K/30fps. Not only is the Avata 360 an Antigravity A1 killer, but this could potentially mean that DJI will start packing 8K/60fps into its action cameras, which wouldn't be good news for Insta360.</p><p>Combine that with 120MP stills, user-friendly editing software, and sublime build quality, and you've got a drone that will stay on top for a long, long time. The Avata 360 is clearly the king of 360° drones, and I can't picture it being dethroned anytime soon.</p><h2 class="article-body__section" id="section-dji-avata-360-vs-antigravity-a1-ratings-scorecard"><span>DJI Avata 360 vs Antigravity A1: Ratings scorecard</span></h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>DJI Avata 360</p></th><th  ><p>Antigravity A1</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price and value (5)</strong></p></td><td  ><p>5</p></td><td  ><p>2</p></td></tr><tr><td class="firstcol " ><p><strong>Design (15)</strong></p></td><td  ><p>14</p></td><td  ><p>15</p></td></tr><tr><td class="firstcol " ><p><strong>Portability (5)</strong></p></td><td  ><p>3</p></td><td  ><p>5</p></td></tr><tr><td class="firstcol " ><p><strong>Controls & features (10)</strong></p></td><td  ><p>10</p></td><td  ><p>8</p></td></tr><tr><td class="firstcol " ><p><strong>App (10)</strong></p></td><td  ><p>10</p></td><td  ><p>9</p></td></tr><tr><td class="firstcol " ><p><strong>Image quality (20)</strong></p></td><td  ><p>20</p></td><td  ><p>15</p></td></tr><tr><td class="firstcol " ><p><strong>Video quality (25)</strong></p></td><td  ><p>25</p></td><td  ><p>23</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life (10)</strong></p></td><td  ><p>9</p></td><td  ><p>10</p></td></tr><tr><td class="firstcol " ><p><strong>Total Score (100)</strong></p></td><td  ><p>96</p></td><td  ><p>87</p></td></tr></tbody></table></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eBnwke"></div>                            </div>                            <script src="https://kwizly.com/embed/eBnwke.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/cameras-photography/drones/dji-avata-360-review">'The best 360-degree drone, maybe ever' — I tested the DJI Avata 360 for 3 weeks and it's the new gold standard</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">I’ve been testing the Antigravity A1 and the world’s first-ever 360° drone confirms one thing: DJI has some serious competition</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-exclusive-developer-interview">“What if drones became an extension of our senses?”: I spoke with the Antigravity A1’s product lead about the brand’s inspirations, hopes and challenges</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test action cameras for a living — these 2 DJI deals are the only ones worth your money in Amazon's early spring deals ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/i-test-action-cameras-for-a-living-these-2-dji-deals-are-the-only-ones-worth-your-money-in-amazons-early-spring-deals</link>
                                                                            <description>
                            <![CDATA[ Lowest ever prices on Osmo Action 4 and Osmo Action 5 Pro bundles for Amazon's Big Spring Sale. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">2WXE2oXiffLDm8M2ifEzvC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GyqT686mQ83pXWk5px6QsK-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 24 Mar 2026 12:46:29 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/GyqT686mQ83pXWk5px6QsK-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The DJI Osmo Action 5 Pro against a blurred background of trees and greenery, with a Tom&#039;s Guide Amazon Spring Sale badge in the lower left corner.]]></media:description>                                                            <media:text><![CDATA[The DJI Osmo Action 5 Pro against a blurred background of trees and greenery, with a Tom&#039;s Guide Amazon Spring Sale badge in the lower left corner.]]></media:text>
                                <media:title type="plain"><![CDATA[The DJI Osmo Action 5 Pro against a blurred background of trees and greenery, with a Tom&#039;s Guide Amazon Spring Sale badge in the lower left corner.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GyqT686mQ83pXWk5px6QsK-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon's early spring deals have arrived, and that means awesome discounts on tech, including some of the <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action cameras</a>. If you're after a new camera to film your daring exploits, or to record your high octane motoring pursuits, believe me, now is the time! DJI just slashed its prices for the spring sales, with the <a href="https://www.amazon.com/dp/B0DBR8HVZG" target="_blank" rel="nofollow">DJI Osmo Action 5 Pro Adventure Combo hitting its lowest ever price at Amazon</a>, and the <a href="https://www.amazon.com/dp/B0DS2B3P2B" target="_blank" rel="nofollow">DJI Osmo Action 4 Essential Combo following suit at just $199</a>.</p><p>Not every deal is a winner in these kinds of sales events, but these two definitely are. How do I know? Because I'm Tom's Guide's cameras editor — I've been testing, comparing and tracking the prices of every action camera for years. So trust me when I say these are genuinely good deals.</p><div class="product"><a data-dimension112="0c9fe182-4503-4148-a9f2-21825950be4c" data-action="Deal Block" data-label="The Osmo Action 5 Pro Adventure Combo bundles three batteries, a charging case, a selfie stick and a quick release mount alongside the base camera. I tested this specific combo for my OA5 Pro review, and it's the bundle I'd recommend, as those extra batteries and charging case are super handy. It's the best value for money given all the included accessories. This is the lowest ever price for the Adventure Combo, so it's worth scooping up this deal while you can." data-dimension48="The Osmo Action 5 Pro Adventure Combo bundles three batteries, a charging case, a selfie stick and a quick release mount alongside the base camera. I tested this specific combo for my OA5 Pro review, and it's the bundle I'd recommend, as those extra batteries and charging case are super handy. It's the best value for money given all the included accessories. This is the lowest ever price for the Adventure Combo, so it's worth scooping up this deal while you can." data-dimension25="$368" href="https://www.amazon.com/dp/B0DBR8HVZG" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="yMZCoLCeiskmk7g3Qcsfum" name="DJI OA5 Pro Deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yMZCoLCeiskmk7g3Qcsfum.jpg" mos="" align="middle" fullscreen="" width="1500" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Osmo Action 5 Pro Adventure Combo bundles three batteries, a charging case, a selfie stick and a quick release mount alongside the base camera. I tested this specific combo for my OA5 Pro review, and it's the bundle I'd recommend, as those extra batteries and charging case are super handy. It's the best value for money given all the included accessories. This is the lowest ever price for the Adventure Combo, so it's worth scooping up this deal while you can.<a class="view-deal button" href="https://www.amazon.com/dp/B0DBR8HVZG" target="_blank" rel="nofollow" data-dimension112="0c9fe182-4503-4148-a9f2-21825950be4c" data-action="Deal Block" data-label="The Osmo Action 5 Pro Adventure Combo bundles three batteries, a charging case, a selfie stick and a quick release mount alongside the base camera. I tested this specific combo for my OA5 Pro review, and it's the bundle I'd recommend, as those extra batteries and charging case are super handy. It's the best value for money given all the included accessories. This is the lowest ever price for the Adventure Combo, so it's worth scooping up this deal while you can." data-dimension48="The Osmo Action 5 Pro Adventure Combo bundles three batteries, a charging case, a selfie stick and a quick release mount alongside the base camera. I tested this specific combo for my OA5 Pro review, and it's the bundle I'd recommend, as those extra batteries and charging case are super handy. It's the best value for money given all the included accessories. This is the lowest ever price for the Adventure Combo, so it's worth scooping up this deal while you can." data-dimension25="$368">View Deal</a></p></div><div class="product"><a data-dimension112="49085842-1ba5-40ad-bb1a-c300720f4bc2" data-action="Deal Block" data-label="The DJI Osmo Action 4 Essential Combo packs the core accessories you'll need to get shooting straight away, including a cage and quick release mount for attaching to selfie sticks. The camera alone normally hovers around the $200 mark these days (and it's a steal for that price), making this deal excellent value for money." data-dimension48="The DJI Osmo Action 4 Essential Combo packs the core accessories you'll need to get shooting straight away, including a cage and quick release mount for attaching to selfie sticks. The camera alone normally hovers around the $200 mark these days (and it's a steal for that price), making this deal excellent value for money." data-dimension25="$199" href="https://www.amazon.com/dp/B0DS2B3P2B" 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:86.93%;"><img id="hBM22nCbBZdNQXzTtEAxVJ" name="DJI Osmo Action 4 Essential Combo" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hBM22nCbBZdNQXzTtEAxVJ.jpg" mos="" align="middle" fullscreen="" width="1500" height="1304" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Osmo Action 4 Essential Combo packs the core accessories you'll need to get shooting straight away, including a cage and quick release mount for attaching to selfie sticks. The camera alone normally hovers around the $200 mark these days (and it's a steal for that price), making this deal excellent value for money.<a class="view-deal button" href="https://www.amazon.com/dp/B0DS2B3P2B" target="_blank" rel="nofollow" data-dimension112="49085842-1ba5-40ad-bb1a-c300720f4bc2" data-action="Deal Block" data-label="The DJI Osmo Action 4 Essential Combo packs the core accessories you'll need to get shooting straight away, including a cage and quick release mount for attaching to selfie sticks. The camera alone normally hovers around the $200 mark these days (and it's a steal for that price), making this deal excellent value for money." data-dimension48="The DJI Osmo Action 4 Essential Combo packs the core accessories you'll need to get shooting straight away, including a cage and quick release mount for attaching to selfie sticks. The camera alone normally hovers around the $200 mark these days (and it's a steal for that price), making this deal excellent value for money." data-dimension25="$199">View Deal</a></p></div><h2 id="two-easy-recommendations-to-make">Two easy recommendations to make</h2><p>Recommending these two deals is extremely easy. Firstly, I've extensively tested and loved both cameras for my <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review">DJI Osmo Action 5 Pro review</a> and <a href="https://www.tomsguide.com/reviews/dji-osmo-action-4">DJI Osmo Action 4 review</a>. Secondly, they're already cameras I feature in my roundup of the <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action cameras</a>. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/BM_g53QCwxE" allowfullscreen></iframe></div></div><p>The Osmo Action 5 Pro spent a long time at the top of that guide as the best overall action camera on the market. It's since been replaced by its newer sibling, the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-6-review">DJI Osmo Action 6</a>, but as the OA5 Pro's price dropped with the launch of the new model it's kept a place on my guide as "best value for money". With 4K/60fps, excellent stabilization, very impressive battery life and joint-best-in-class (tied with the OA6) waterproofing, its core features are unmatched by the likes of GoPro and Insta360. Yet its price undercuts anything comparable its rivals offer. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/rBqOys-J6Sw" allowfullscreen></iframe></div></div><p>The Osmo Action 4 has long held the "best budget" spot on the guide. It's a little rougher around the edges than the OA5 Pro, with less-effective stabilization and slightly weaker waterproofing and battery life. But for under $200, you'll be hard pressed to find anything as powerful as this little camera from other manufacturers. It also offers 4K/60fps, decent stabilization and waterproofing that exceeds anything GoPro has to offer. As I mentioned above, this camera usually retails at around the $200 mark these days, but that's for the standalone camera, making this Combo deal very good value for money.</p><p>Both of these cameras offer seamless integration with other DJI products. Recent DJI cameras share batteries, quick release adapters, and all can hook up wirelessly to DJI mics, like the <a href="https://www.tomsguide.com/audio/dji-mic-mini-review">DJI Mic Mini</a>.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ FCC "exceeded its statutory authority" claims DJI in lawsuit to overturn drone ban ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/fcc-exceeded-its-statutory-authority-claims-dji-in-lawsuit-to-overturn-drone-ban</link>
                                                                            <description>
                            <![CDATA[ DJI is suing to reverse the FCC ban that prohibits the company's drones from being imported and sold in the US. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vC992BfbVEhgFhgzksgJSA</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/tYgA7tQfSDVAnrfR5mUimV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 25 Feb 2026 00:56:30 +0000</pubDate>                                                                                                                                <updated>Wed, 25 Feb 2026 00:56:34 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></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/tYgA7tQfSDVAnrfR5mUimV-1280-80.jpg">
                                                            <media:credit><![CDATA[null]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Mavic Air]]></media:description>                                                            <media:text><![CDATA[DJI Mavic Air]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Mavic Air]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/tYgA7tQfSDVAnrfR5mUimV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>DJI isn't taking the <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">FCC's drone ban</a> lying down. The company is suing the agency to reverse the ban that prevents the Chinese company from importing or selling new drone models in the United States.</p><p>On Friday, February 20, <a href="https://www.scribd.com/document/1003169977/Get-Merged-File" target="_blank">DJI filed a petition</a> with the US Court of Appeals for the Ninth Circuit that challenged the ban which went into effect this past December. DJI is requesting the court review the order, arguing that the FCC "exceeded its statutory authority" and violated the Fifth Amendment when it added DJI drones and parts to its Covered List.</p><p>The Covered List includes telecommunications equipment that has been deemed to pose a risk to national security. The FCC's ban basically blocks all foreign-made drone components and new foreign-manufactured drone models under the "threat" of national security.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:57.35%;"><img id="jopVWssa3L3cDnnLMv3t4Q" name="dji drone camera.jpg" alt="DJI Drone camera" src="https://cdn.mos.cms.futurecdn.net/jopVWssa3L3cDnnLMv3t4Q.jpg" mos="" align="middle" fullscreen="" width="2000" height="1147" attribution="" endorsement="" 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 DJI's petition, it asks the Court to hold the ban "unlawful" and to vacate it.</p><p>The FCC did relax the rules in January when it released the <a href="https://www.fcc.gov/files/nsd-fcc-covered-list-waiver-0126" target="_blank" rel="nofollow">NSD FCC Covered List Waiver 0126. </a>Page two of that waiver document states that foreign-made drones may be allowed to be sold in the US after passing "rigorous cyber and hardware assessments."</p><p>Drones that pass would be allowed to remain available until January 1, 2027. However, it does not apply to consumer drones but rather those designed for first responders, government agencies, search and rescue teams and surveillance teams.</p><p>“Despite repeated efforts to engage with the government, DJI has never been given the chance to provide information to address or refute any concerns. These procedural and substantive deficiencies violate the Constitution and federal law," the FCC told <a href="https://www.pcmag.com/news/dji-sues-to-reverse-fcc-drone-ban" target="_blank">PCMag</a>.</p><h2 id="uphill-battle">Uphill battle</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3048px;"><p class="vanilla-image-block" style="padding-top:66.63%;"><img id="MqHNNWZgM28m6Fp2NRyKsc" name="shutterstock_2462245139" alt="Supreme Court and American flag" src="https://cdn.mos.cms.futurecdn.net/MqHNNWZgM28m6Fp2NRyKsc.jpg" mos="" align="middle" fullscreen="" width="3048" height="2031" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>DJI has been fighting the ban since it was enacted by the House of Representatives in 2023, and it hasn't gone well. In September 2025, US District <a href="https://fingfx.thomsonreuters.com/gfx/legaldocs/lbvgzenrrpq/DJI%20v%20DOD%20-%20opinion%20-%2020250926.pdf" target="_blank">Judge Paul Friedman ruled against DJI </a>saying that there is "substantial evidence" that the company  “contributes to the Chinese defense industrial base."</p><p>Courts have previously <a href="https://apnews.com/article/technology-government-and-politics-business-f838db2417516a4582dfceba2eed3b41" target="_blank">upheld bans </a>of other companies like Huawei, which has been banned since 2019 under the first Trump administration. U.S. courts have historically been hesitant to stick with U.S. government decisions regarding national security.</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/cameras-photography/drones/i-test-drones-for-a-living-heres-what-i-think-of-reddits-top-recommendations-for-beginners">I test drones for a living — here’s what I think of Reddit’s top recommendations for beginners</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/best-footage-i-ve-taken-on-drones-reviewed-2025">I reviewed every drone that came out in 2025: these are the best photos and videos I’ve taken</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-latest-rumors-and-leaks-february-2026">The rumored DJI Avata 360’s price has been leaked online — and it might be surprisingly affordable compared to Insta360’s Antigravity A1</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI Osmo Pocket 4 leaked in new video — here's what's new ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-pocket-4-leaked-in-new-video-heres-whats-new</link>
                                                                            <description>
                            <![CDATA[ A new DJI Osmo Pocket 4 appears in a series of leaks, including an FCC listing indicating it could come to the U.S. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">8rLyQcvLngHJkgN9Jmpp5g</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/zPtoqfb8gasTtUXrYkyo7R-1280-80.png" type="image/png" length="0"></enclosure>
                                                                        <pubDate>Fri, 20 Feb 2026 19:57:44 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/png" url="https://cdn.mos.cms.futurecdn.net/zPtoqfb8gasTtUXrYkyo7R-1280-80.png">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Osmo Pocket 3 in busy city]]></media:description>                                                            <media:text><![CDATA[DJI Osmo Pocket 3 in busy city]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Osmo Pocket 3 in busy city]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/zPtoqfb8gasTtUXrYkyo7R-1280-80.png" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A series of leaks discovered by <a href="https://thenewcamera.com/dji-pocket-4-video-leaked/" target="_blank">NewCamera </a>has revealed a metric ton of information about a new version of DJI's popular mini vlogging camera, the Osmo Pocket 4. </p><p>The current <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3">DJI Osmo Pocket 3</a> is an excellent little camera, and save a couple of small flaws, would have received a full 5 stars in our review. NewCamera's leaks appear to show significant improvements over the three-year-old device.</p><p>They spotted a video on Instagram that was allegedly filmed inside a DJI-authorized store in Kuala Lumpur, Malaysia. That video has since been deleted, but was saved and can be seen here:</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/_sh9zJd1pyw" allowfullscreen></iframe></div></div><p>At first glance, the purported Osmo Pocket 4 looks very similar to the Pocket 3. However, we can see what appears to be a zoom button and a Nintendo Switch 2-esque "C" button above the record button and thumbstick. </p><p>The gimbal appears to be longer and has a new grip. The biggest change looks to be a built-in LED light on top of the camera, which looks like it'll be perfect for shooting in low light or at night.</p><p>Additionally, the person in the video appears to be shooting in "Super Photo" mode at 33MP.</p><h2 id="osmo-pocket-4-specs">Osmo Pocket 4 Specs</h2><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="hHNCu5nuy8yNCLkeAGr299" name="Osmo Pocket 3 filming skyline.jpg" alt="Osmo Pocket 3 Flip Out Screen" src="https://cdn.mos.cms.futurecdn.net/hHNCu5nuy8yNCLkeAGr299.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There are some specs for the Pocket 4, and largely it appears to be very similar to the Pocket 3 with some upgrades, and a potential leap in price.</p><p>Some minor updates include a brighter, rotatable OLED display, a larger battery, the LED light (which may be optional) and potentially 6K recording at 30 fps.</p><div ><table><caption>DJI Osmo Pocket 4 vs Osmo Pocket 3 Specs</caption><thead><tr><th class="firstcol empty" ></th><th  ><p>Osmo Pocket 4</p></th><th  ><p>Osmo Pocket 3</p></th></tr></thead><tbody><tr><td class="firstcol " ><p>Sensor</p></td><td  ><p>1-inch CMOS</p></td><td  ><p>1-inch CMOS</p></td></tr><tr><td class="firstcol " ><p>Video</p></td><td  ><p>4K/120fps (up to 6K/30fps)</p></td><td  ><p>4K/120fps</p></td></tr><tr><td class="firstcol " ><p>Stabilization</p></td><td  ><p>Advanced 3-axis gimbal + AI tracking</p></td><td  ><p>3-axis gimbal</p></td></tr><tr><td class="firstcol " ><p>Display</p></td><td  ><p>2-inch rotatable OLED </p></td><td  ><p>2-inch OLED</p></td></tr><tr><td class="firstcol " ><p>Battery</p></td><td  ><p>1,545 mAh</p></td><td  ><p>1,300 mAh</p></td></tr><tr><td class="firstcol " ><p>Connectivity</p></td><td  ><p>Fast AF, Wi-Fi 6</p></td><td  ><p>Basic AF, Wi-Fi 5</p></td></tr><tr><td class="firstcol " ><p>Weight</p></td><td  ><p>179g</p></td><td  ><p>179g</p></td></tr><tr><td class="firstcol " ><p>Price</p></td><td  ><p>$549 - 699 (est) (base), $699 - $749 (w/ LED)</p></td><td  ><p>$549</p></td></tr></tbody></table></div><p>It's possible the camera and the LED light will be more expensive than the Pocket 3 thanks to component price increases and President Trump's tariffs. </p><p>However, as of this writing, the <a href="https://www.nytimes.com/live/2026/02/20/us/trump-tariffs-supreme-court">U.S. Supreme Court just struck down Trump's tariffs</a> in a major ruling. However, it will take some time to unwind the taxes, and the ruling left open the door for the administration to pursue other avenues to impose import levies. Additionally, as the <a href="https://www.nytimes.com/live/2026/02/20/us/trump-tariffs-supreme-court" target="_blank">New York Times reports</a>, the president is steadfast in his belief that he can just impose tariffs as is his wont.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X74jKe"></div>                            </div>                            <script src="https://kwizly.com/embed/X74jKe.js" async></script><p>Asked directly if he planned to work with Congress to impose the kinds of sweeping tariffs he prefers, Trump said he had no intention of doing so. “I don’t have to,” he said. “I have the right to do tariffs.”'</p><p>With that in mind, pricing for the Pocket 4 is up in the air and could change drastically between now and launch.</p><h2 id="will-it-release-in-the-us">Will it release in the US?</h2><p>In December 2025, D<a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">JI drones were officially banned</a> from sale in the United States. It not only hit drones but also any drone that used foreign-made parts, including batteries, imaging sensors and batteries.</p><p>Pocket 4 isn't a drone, but it might get more scrutiny from the FCC. However, the ban only affects newer devices that didn't receive approval before December. The Pocket 4 has popped up in <a href="https://thenewcamera.com/dji-pocket-4-pro-coming-to-usa-pocket-4-pro-fccid-leaks/" target="_blank">FCC regulatory listings, </a>suggesting that it may have squeaked in before that deadline.</p><p>Still, the FCC has relaxed a little with its <a href="https://www.fcc.gov/files/nsd-fcc-covered-list-waiver-0126" target="_blank" rel="nofollow">NSD FCC Covered List Waiver 0126</a> that could allow foreign-made drones and components to be sold in the US after "rigorous cyber and hardware assessments." </p><p>Meanwhile, you <a href="https://www.tomsguide.com/cameras-photography/drones/dji-drones-still-available-to-buy-usa-february-26">can still purchase older DJI products</a> that were approved pre-ban.</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/cameras-photography/drones/dji-avata-360-latest-rumors-and-leaks-february-2026">The rumored DJI Avata 360’s price has been leaked online — and it might be surprisingly affordable compared to Insta360’s Antigravity A1</a></li><li><a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-6-review">Sorry GoPro, the DJI Osmo Action 6 just won the action camera war</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">I’ve been testing the DJI Neo 2 and it improves on its predecessor in every way — this is the best budget drone you can buy</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Sorry GoPro, the DJI Osmo Action 6 just won the action camera war ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-6-review</link>
                                                                            <description>
                            <![CDATA[ The DJI Osmo Action 6 is the finest action camera you can buy. Fantastic image quality, best-in-class battery life and more… all for less than a GoPro. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">hhSPZTForAmx5dHyoPkPRh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/SmVyWXK38y6W8aV2QZGMKL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 20 Feb 2026 10:55:04 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:31:32 +0000</updated>
                                                                                                                                            <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/SmVyWXK38y6W8aV2QZGMKL-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The DJI Osmo Action 6 on a stone surface with a blue background]]></media:description>                                                            <media:text><![CDATA[The DJI Osmo Action 6 on a stone surface with a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[The DJI Osmo Action 6 on a stone surface with a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/SmVyWXK38y6W8aV2QZGMKL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When it made the DJI Osmo Action 6, Chinese tech giant DJI was presumably faced with somewhat of a tricky challenge: how to improve on the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review">DJI Osmo Action 5 Pro</a> (OA5 Pro), already the <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action camera</a> on the market.</p><p>Doing too much with the Osmo Action 6 (OA6) risked spoiling the formula. So DJI could’ve just pulled a GoPro: tweak the core performance very slightly (if at all), add an interchangeable lens mount, and <em>voilà</em>.</p><p>But DJI went at least a bit further. Following on the Hero13 Black’s coat-tails, the OA6 has indeed been given an interchangeable lens mount. And while the OA6’s headline figures are much the same as the older model’s, there’s also a major upgrade under the hood: the Osmo Action line has finally pushed beyond 4K, with a shiny new 8K/30p maximum resolution. </p><p>Otherwise, things are little-changed: 65-foot waterproofing; beautiful build quality; OLED displays front and back; plus 50GB internal storage. Is that a bad thing? Nope. The OA5 Pro wasn’t broken, so there was no way in hell it needed fixing. </p><p>For the complete breakdown, read my full DJI Osmo Action 6 review.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-specs"><span>DJI Osmo Action 6 review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p><a href="https://www.amazon.com/DJI-Essential-Variable-Aperture-Cold-Resistant/dp/B0FNMP8LZX" target="_blank" rel="nofollow">$369</a> / <a href="https://www.amazon.co.uk/DJI-Enhanced-Variable-Aperture-Batteries/dp/B0FNMP8LZX/" target="_blank" rel="nofollow">£319</a></p></td></tr><tr><td class="firstcol " ><p><strong>Max video resolution</strong></p></td><td  ><p>8K/30fps</p></td></tr><tr><td class="firstcol " ><p><strong>Sensor size</strong></p></td><td  ><p>1/1.1-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Rear screen</strong></p></td><td  ><p>2.5-inch OLED touchscreen</p></td></tr><tr><td class="firstcol " ><p><strong>Front screen</strong></p></td><td  ><p>1.46-inch OLED touchscreen</p></td></tr><tr><td class="firstcol " ><p><strong>Internal memory</strong></p></td><td  ><p>50GB</p></td></tr><tr><td class="firstcol " ><p><strong>MicroSD slot</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Pre-recording</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Loop recording</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Live streaming</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, Wi-Fi, USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance</strong></p></td><td  ><p>65ft (20m)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>1,950 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>2.86 x 1.85 x 1.3 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>5.2 ounces</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-osmo-action-6-review-price-availability"><span>DJI Osmo Action 6 review: Price & availability</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="KMYKLJkPzWPRz942h5RGKL" name="DJI Osmo Action 6-17.JPG" alt="The DJI Osmo Action 6 in hand on a selfie stick with a blue background" src="https://cdn.mos.cms.futurecdn.net/KMYKLJkPzWPRz942h5RGKL.jpg" mos="" align="middle" fullscreen="" width="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 DJI Osmo Action 6 starts at <a href="https://www.amazon.com/DJI-Essential-Variable-Aperture-Cold-Resistant/dp/B0FNMP8LZX" target="_blank" rel="nofollow">$369</a> / <a href="https://www.amazon.co.uk/DJI-Enhanced-Variable-Aperture-Batteries/dp/B0FNMP8LZX/" target="_blank" rel="nofollow">£319</a> for the Essential Combo, which gives you just the camera and a battery. The <a href="https://www.amazon.com/DJI-Essential-Variable-Aperture-Cold-Resistant/dp/B0FM3X3DW5" target="_blank" rel="nofollow">Standard Combo costs $379</a> / <a href="https://www.amazon.co.uk/DJI-Enhanced-Variable-Aperture-Batteries/dp/B0FM3X3DW5" target="_blank" rel="nofollow">£329</a> and is the one I’d recommend for newcomers, as it bundles a spare battery and basic accessories. At an extra $10 / £10, it’s a no brainer.</p><p>Once again, DJI’s pricing is extremely competitive, undercutting the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-hero13-black-can-the-champ-keep-his-title">GoPro Hero13 Black</a>’s $399 launch price (although the price has since risen to $429 at Amazon, as I write this in early 2026). </p><p>$369 is only a $20 increase over the OA5 Pro’s $349 launch price, so not a major hike. Meanwhile, in the U.K., the OA6’s launch price is actually £10 cheaper than the OA5 Pro, which cost £329 at launch — very welcome, as it’s rare to see a price drop these days.</p><h2 id="availability-2">Availability</h2><p>With DJI these days, though, it isn’t the price that’s the problem — it’s the availability. In the U.S. anyway. In case you missed it, <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">DJI is feuding with the U.S. government over drones</a> and was already pretty annoyed about tariffs. Until further notice, the company has pulled official support from the U.S. market. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7kvnKg84tWqhDMnUXswmJL" name="DJI Osmo Action 6-15.JPG" alt="The DJI Osmo Action 6 spare battery case on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/7kvnKg84tWqhDMnUXswmJL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Osmo Action 6 Enhanced Combo comes with 3 batteries and a handy charging case. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>That means you can’t buy the OA6 directly from DJI, although it’s available from third party retailers like Amazon. Importantly, it means there’s no official aftercare and you can’t buy a DJI care plan. In the U.S. (but nowhere else), if your device breaks, DJI ain’t gonna fix it. </p><p>It’s a risk you’ll have to weigh up. I’ve owned<em> many</em> DJI products and, aside from some pre-production samples (which we expect to be imperfect), not one has broken.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-design"><span>DJI Osmo Action 6 review: Design</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iuSRfrjGSg2D7jrfVzPneL" name="DJI Osmo Action 6-18.JPG" alt="The DJI Osmo Action 6 in hand" src="https://cdn.mos.cms.futurecdn.net/iuSRfrjGSg2D7jrfVzPneL.jpg" mos="" align="middle" fullscreen="" width="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>Measuring 2.86 x 1.85 x 1.3 inches and weighing 5.2 ounces, the DJI Osmo Action 6 is slightly larger than the OA5 Pro (2.77 x 1.74 x 1.29 inches, 5.15 ounces), and now only a fraction smaller than the Hero13 Black (2.8 x 2 x 1.32 inches, 5.4 ounces). There’s not a lot in it though, so none will be markedly more mountable than the others.</p><p>I usually prefer the squatter design of the Osmo Action line versus the GoPro Hero13 Black — when helmet chin mounting, the lower height gives you more room to angle the camera upwards and also prevents it intruding into my field of view. Unfortunately, though, the OA6 is almost the same height as the Hero13 Black. </p><p>Still, I had no major problem mounting the OA6 on my chin mount, and it didn’t weigh my helmet down either. The OA6 was also able to fit into a tight gap on my handlebars, where larger 360 cameras like the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-max2-review">GoPro MAX2</a> ($499) can't fit. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pGodSWMxaSPSCudfYFcaWL" name="DJI Osmo Action 6-1.JPG" alt="The DJI Osmo Action 6 on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/pGodSWMxaSPSCudfYFcaWL.jpg" mos="" align="middle" fullscreen="" width="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>Build quality is phenomenal. The exterior is finished in a rugged metal, which feels great. All the buttons click nicely with decent positive feedback (important when wearing gloves) and the hatches click firmly shut. The screens are also beautiful, but I’ll get onto those a little later.</p><p>A new design feature is, of course, the interchangeable lens mount. But I’ll cover that more in the video section below.</p><h2 id="weatherproofing">Weatherproofing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gQJdMu4WfA4JyvqDxy4kcL" name="DJI Osmo Action 6-16.JPG" alt="The DJI Osmo Action 6 mounted to a backpack strap" src="https://cdn.mos.cms.futurecdn.net/gQJdMu4WfA4JyvqDxy4kcL.jpg" mos="" align="middle" fullscreen="" width="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>Waterproofing has stayed the same as the OA5 Pro at 65 feet / 20 meters without any case needed. This was already class-leading, so DJI didn’t need to build on it. The Hero13 Black offers only 33 feet / 10 meters while the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-ace-pro-2-review">Insta360 Ace Pro 2</a> ($399) manages 39 feet / 12 meters. If you’re a snorkeler or diver, the Osmo Action line is still the one for you. </p><p>DJI seems very proud of the OA6’s cold temperature performance, marketing the camera with images of it smashing through ice and being used while skiing. In reality, the -20°C minimum operating temperature is the same as the OA5 Pro, because they use the same battery. Again, this is still best in class, as the GoPro Enduro battery is only rated down to -10°C.</p><h2 id="mounting">Mounting</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rgYpeoEXrv4abfbMTqc5YL" name="DJI Osmo Action 6-19.JPG" alt="The DJI Osmo Action 6 being mounted on a selfie stick" src="https://cdn.mos.cms.futurecdn.net/rgYpeoEXrv4abfbMTqc5YL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Like all its competitors, the Osmo Action 6 features magnetic mounting. It utilizes the same quick release mount found on all recent DJI cameras. I’ve used the exact same quick release adapter on my <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review">DJI Osmo 360</a> ($549), <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-nano-review">DJI Osmo Nano</a> ($299), OA5 and now the OA6.</p><p>This is awesome if you already own DJI gear, saving you money on accessories. And it’s a solid reason to buy the cheaper Essential Combo if you already own an OA5 Pro or DJI Osmo 360 — they all use the same mounts and batteries.</p><p>Sadly, there are still no GoPro-style built-in fingers, so you need to use an adapter for finger-mount accessories.</p><h2 id="connectivity-2">Connectivity</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/FPSCnxsW4zBN2RCTskE9QL.jpg" alt="The DJI Osmo Action 6 on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/CfP27LhggDeU4neJknjYPL.jpg" alt="The DJI Osmo Action 6 on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The Osmo Action 6 hooks up to your smartphone wirelessly via the DJI Mimo App for camera control, updating and basic editing.</p><p>There’s a USB-C port for wired hookup of accessories or a microphone (but you’ll need <a href="https://www.amazon.com/Original-Action-3-5mm-Adapter-Microphone/dp/B0D3L7VP6C/" target="_blank" rel="nofollow">DJI’s USB-C to 3.5mm audio adapter</a>). The USB-C port has its own hatch, so no exposing the battery when using accessories (seriously, GoPro, why is that still a thing?).</p><p>The Osmo Action 6 features a MicroSD slot that accepts up to 1TB cards, but there’s also 50GB of internal storage — up from the OA5 Pro’s 47GB. This is <em>so</em> useful. I ran out of space on a 64GB card during testing and was able to switch to internal and keep shooting.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-controls"><span>DJI Osmo Action 6 review: Controls</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/BZnHvbTkTkFZAsYPzZ9zSL.jpg" alt="The DJI Osmo Action 6 on a stone surface" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/kmwffCBLupyVn7fbov3sNL.jpg" alt="The DJI Osmo Action 6 on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The Osmo Action 6’s on-board controls are minimal, which is normal for action cameras. One record and one power button, and that’s it. But they work, and that’s not something to take lightly…</p><p>See, every GoPro I’ve owned has decided on its own terms when to turn on — sometimes the power button works, sometimes it doesn’t; sometimes the button needs a long press, sometimes a short press. And that’s without adding thick gloves into the equation. It’s infuriating. By contrast, DJI’s buttons just work, always, gloves or not. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/XTTstGPmu9h6BhitWTnHTL.jpg" alt="The DJI Osmo Action 6 on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/t3pyHZvGAYYTPKGX9usGJL.jpg" alt="The DJI Osmo Action 6 on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Most camera control is done via screens. The OA6 features the same 2.5-inch rear and 1.4-inch front OLED displays, and they’re beautiful. The rear in particular is bright and wide, with plenty of space to navigate menus, and is highly responsive. In comparison, remove “wide,” “plenty of space to navigate menus” and “highly responsive”... and you have yourself a GoPro screen.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/gMJVCpfhfKjS553ih8gMFL.jpg" alt="The DJI Osmo Action 6 on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/UDvng4JJWm3VQypVpLnFHL.jpg" alt="The DJI Osmo Action 6 on a stone surface with a blue background" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>DJI’s menu system is also excellent. It’s intuitively laid out, allowing quick navigation around the camera, and offers a high level of in-depth control. It’s miles ahead of the dated GoPro menu.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-stabilization"><span>DJI Osmo Action 6 review: Stabilization</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/-ErtT2Z_fzE" allowfullscreen></iframe></div></div><p>The Osmo Action 6 features the same RockSteady 3.0 stabilization system as its predecessor, which is great. There’s a new, larger sensor, which should give the OA6 more space to crop into frame and better stabilize footage. Honestly, though, I can’t tell the difference between the OA5 Pro and OA6 stabilization. In fact, stabilization is so good on all flagships these days, including the Hero13 Black and Insta360 Ace Pro 2, that you’ll get beautifully stable footage from any of them.</p><p>As you can see in the video above, the OA6 weathered the bumpy ground supremely and footage stayed very smooth. And in the higher octane clip below, again, it’s a super smooth performance. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/RyFLk51jLiA" allowfullscreen></iframe></div></div><p>The Osmo Action 6 also features a HorizonSteady mode for keeping the horizon level in footage that leans heavily — motorcycling or skiing, for instance — I personally like showing lean angles, but it’s nice to have a horizon level mode there if you want it.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-focusing"><span>DJI Osmo Action 6 review: Focusing</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sSAz53XY7zvQKL22W5rNVL" name="DJI Osmo Action 6-2.JPG" alt="The DJI Osmo Action 6 on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/sSAz53XY7zvQKL22W5rNVL.jpg" mos="" align="middle" fullscreen="" width="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>Making a return is DJI’s subject tracking mode. Place a subject within the central tracking box and the camera will detect and lock onto it reliably and tenaciously. It only works with humans but it’s still extremely useful for ensuring fast-moving subjects stay in focus. Importantly, this mode is limited to 2.7K resolution.</p><p>There’s also Portrait mode, which tracks faces in frame but is intended more for vlogging, with adjustments to soften skin tones. This mode is limited to 4K/30fps.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/LisF2Tga2dcrjzeHppwLsL.jpg" alt="The DJI Osmo Action 6 with its macro lens fitted" /><figcaption>The Osmo Action 6 with its Macro lens fitted<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/wYJ3AYYdYRNnVM75XMWbnL.jpg" alt="The DJI Osmo Action 6  with its ultra wide angle lens fitted" /><figcaption>The Osmo Action 6 with its Ultra Wide lens fitted<small role="credit">Future</small></figcaption></figure></figure><p>A major upgrade in the focusing realm comes with the new macro lens accessory. With this lens fitted, you can manually shift the minimum focusing distance to focus on close up subjects in the foreground. It’s really cool and gives you more control than previous OA cameras.</p><p>The OA6 sports a variable aperture system. You can choose between fixed focus at f/2 or f/4, which is especially handy for fixing your focal plane for a wider depth of field when using the macro lens. </p><p>With the standard lens fitted, you can also shift the automatic variable aperture at the wide end from f/2-f/4 to f/2.8-f/4, in increments of 0.2 (so f/2, f/2.2, f/2.4, f/2.6, f/2.8). All of these ranges end at f/4 on the narrow end.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/YQkmLf3Nl_8" allowfullscreen></iframe></div></div><p>Truthfully, I haven’t had much use for the different variable aperture bands. The difference between f/2 and f/2.8 is pretty difficult to discern in most action camera footage, where footage is moving fast, FoVs are very wide and subjects are often at infinity, so I prefer to keep it at f/2-f/4 to give myself the best low-light performance if needed. But hey, if you need the camera to operate at maximum f/2.8 to get that slightly deeper focal plane versus f/2, you can.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-video-performance"><span>DJI Osmo Action 6 review: Video performance</span></h2><p>One of the major upgrades the OA6 sports over the rest of the lineup is 8K/30fps shooting, possible thanks to a new 1/1.1-inch sensor (up from the 1/1.3-inch sensor in the OA5 Pro). Beware: manufacturers love to bandy about +4K maximum resolutions, but for many people, they’re of little use given YouTube still tops out at 4K. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/R7uqbaJsYXk" allowfullscreen></iframe></div></div><p>However, any +4K resolution is beneficial for a couple of reasons. More res gives you room to crop into frame and maintain at least 4K resolution, for extra flexibility with framing. It also allows you to export oversampled 4K footage for super sharp results. Both will be of use to those who edit their footage, especially pros.</p><p>The Hero13 Black tops out at 5.7K/30fps, and the Ace Pro 2 also tops out at 8K/30fps. The OA5 Pro, meanwhile, was capped at 4K/60fps. Annoyingly, on the OA6, there’s no selectable resolution between 4K/60fps and 8K/30fps. So, you can’t shoot 6K/60fps, for example, if you wanted to strike a balance between higher resolution and a faster frame rate.</p><p>4K can be shot at up to 120fps for high-res slow motion footage (240fps is also available at 1080p). 4K footage looks excellent — lovely and sharp. Colors are natural-feeling, although there are now some color filters to apply grades to footage in camera, something DJI has been way behind on. There are 6 to choose from, including vibrant profiles, a skin tone profile, and a few cinematic/nostalgic profiles, too. As with other DJI cameras there’s D-Log M for wide dynamic range capture to preserve highlights in challenging lighting — primarily useful for pros editing in post.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/s6wnHb7KFJE" allowfullscreen></iframe></div></div><p>Obviously, there are the new lenses. GoPro introduced a similar interchangeable lens mount on the Hero12 Black and Hero13 Black. DJI needed to catch up. I tested the Ultra Wide and Macro lenses, and they’re a lot of fun. The Ultra Wide in particular looks gorgeous, allowing you to capture huge panoramic footage. You can see it in action above, and for comparison the Ultra Wide setting on the standard lens below.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/H9R1cqZfAYA" allowfullscreen></iframe></div></div><p>The Macro lens is also a lot of fun, allowing you to get creative with close-up scenes. There’s no anamorphic lens, as on the rival GoPro, but I’m hoping to see the lineup expand that way soon. Nevertheless, interchangeable lenses put more creativity in video shooters’ hands, so I’m a fan.</p><h2 id="low-light-2">Low light</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aNLultEkf_c" allowfullscreen></iframe></div></div><p>Low-light performance is fairly respectable. A 1/1.1-inch sensor won’t ever blow the world away with ultra clean low light footage, but as action cameras go, the OA6 does a decent job. You’ll want to use SuperNight mode, which is now available in up to 4K/60fps (night modes are often locked to 30fps, as on the Osmo Action 5 Pro), which demonstrates DJI’s faith in the sensor.</p><p>The videos in this section show examples of nighttime footage shot at 4K/30fps and 4K/60fps. I think it looks pretty good. The footage doesn’t quite do justice to how dark it was while filming because the camera has brightened up the sky significantly at both 30fps and 60fps. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/BqI9QKZ0FLI" allowfullscreen></iframe></div></div><p>4K/30fps isn’t the cleanest, with noise affecting image sharpness, but it isn’t ruinous and you can still see what’s going on. At 60fps, sharpness has suffered quite a bit, as the camera has bumped ISO as much as it could to brighten things up, so that’s to be expected.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/7zZ2XU37dJk" allowfullscreen></iframe></div></div><p>The camera's inner lens likes to flare a fair bit with bright light sources, which is particularly noticeable at night. It's only really intrusive with super bright lights, which isn't uncommon, and I’m actually a fan of the sunstar flares from medium-bright light sources.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-audio-performance"><span>DJI Osmo Action 6 review: Audio performance</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/hSVIfXBAY3s" allowfullscreen></iframe></div></div><p>The DJI Osmo Action 6’s internal audio quality is very strong. As you can hear in the motorcycle footage above, shot on the camera’s ‘high’ wind reduction, there’s some but not too much wind buffeting and the bike engine still sounds clear. With wind reduction on ‘normal’ in the clip below, it’s still not too bad. In windless scenarios, though, turning off the reduction will give you the best quality audio.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/bKaEtGkwiKI" allowfullscreen></iframe></div></div><p>As with all DJI cameras nowadays, you can hook up DJI mics wirelessly via OsmoAudio. This uses Bluetooth, which compresses and degrades audio quality severely, so it’s fine for vlogging and lower-octane pursuits. For any footage where wind or very loud noises are going to occur, you can connect a wired mic using <a href="https://www.amazon.com/Original-Action-3-5mm-Adapter-Microphone/dp/B0D3L7VP6C/" target="_blank" rel="nofollow">DJI’s USB-C to 3.5mm audio adapter</a>. </p><p>Happily, the Osmo Action 6 also records with timecode, so you can also just record audio separately and sync up via timecode in post.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-app"><span>DJI Osmo Action 6 review: App</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:5333px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jmaAtrmruhNvJLuyxTQUZL" name="DJI Mimo App (OA6)" alt="The DJI Mimo app in use" src="https://cdn.mos.cms.futurecdn.net/jmaAtrmruhNvJLuyxTQUZL.jpg" mos="" align="middle" fullscreen="1" width="5333" height="3000" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/jmaAtrmruhNvJLuyxTQUZL.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DJI / Future)</span></figcaption></figure><p>The Osmo Action 6 pairs with the <a href="https://www.dji.com/uk/downloads/djiapp/dji-mimo">DJI Mimo</a> app, of which I’m a big fan. It’s come on leaps and bounds since the Osmo Action 4, and now offers comprehensive control over the camera in real time as you shoot. </p><p>It also lets you update the camera and gives you some basic tools to edit your footage — although Insta360’s app, with its straight-to-social approach, offers a wider array of editing features (including some rather gimmicky ones).</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-battery-life-overheating"><span>DJI Osmo Action 6 review: Battery life & overheating</span></h2><p>The Osmo Action 6 uses the same 1,950mAh battery as the OA5 Pro and Osmo 360, which I’m very pleased about. Firstly, I own about 15 of the things, and secondly, it’s a solid power cell. DJI claims up to 240 minutes, although that figure isn’t particularly helpful given it’s based on 1080p recording.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Am4s8iUcZa5TpnzPqQNxDL" name="DJI Osmo Action 6-6.JPG" alt="The DJI Osmo Action 6 on a stone surface with its battery hatch open" src="https://cdn.mos.cms.futurecdn.net/Am4s8iUcZa5TpnzPqQNxDL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In my standardized indoor stress testing at 4K/60fps, with the screen set to auto-shut off after a minute, the Osmo Action 6 lasted 120 minutes in total. It overheated after 62 minutes and then again after 40 minutes, which is a fair amount of time.</p><p>In the same test, the OA5 Pro lasted 112 minutes in total and overheated after 43 minutes. The Hero13 Black lasted 80 minutes in total, overheating after 54. The Ace Pro 2 lasted 76 minutes without overheating. Remember, though, mine was a stress test, so overheating isn’t something you’ll have to worry about outside and/or while moving. </p><p>At its maximum 8K/30fps resolution and frame rate, the OA6 overheated after 65 minutes and lasted for 93 minutes, which is longer than anything from GoPro or Insta360 shooting at 4K — go figure.</p><h2 class="article-body__section" id="section-dji-osmo-action-6-review-verdict"><span>DJI Osmo Action 6 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SmVyWXK38y6W8aV2QZGMKL" name="DJI Osmo Action 6-20.JPG" alt="The DJI Osmo Action 6 on a stone surface with a blue background" src="https://cdn.mos.cms.futurecdn.net/SmVyWXK38y6W8aV2QZGMKL.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As I said at the outset, the DJI Osmo Action 6 was building on an already excellent formula. The DJI Osmo Action 5 Pro was a fantastic camera, which held the top spot on our best action cameras guide since not long after its launch. The Osmo Action 6 is a worthy successor, maintaining everything that I loved about its predecessor, but building on it in important ways.</p><p>Core video performance, stabilization and internal audio are fantastic; battery life and waterproofing are best in class. And now there are some fun features for creators to experiment with, namely color filters and the interchangeable lenses. Pros, meanwhile, will relish the addition of higher than 4K res. </p><p>The DJI Osmo Action 6 is the ultimate all rounder. Whether you’re a pro, a content creator or just a casual shooter, there really isn’t a better action camera out there.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI’s first 360 drone might be landing soon according to new pricing and design leaks — here’s what we know so far ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-avata-360-latest-rumors-and-leaks-february-2026</link>
                                                                            <description>
                            <![CDATA[ The long-rumored DJI Avata 360 could be launching soon, and latest leaks and rumors suggest it could be much cheaper than the competition. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TJQuTLv8LXviaXPJZzBttk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UQZfTQ9g4zrymX6RN4y9yY-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 17 Feb 2026 07:15:00 +0000</pubDate>                                                                                                                                <updated>Wed, 18 Feb 2026 14:31:18 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UQZfTQ9g4zrymX6RN4y9yY-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Avata 2]]></media:description>                                                            <media:text><![CDATA[DJI Avata 2]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Avata 2]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UQZfTQ9g4zrymX6RN4y9yY-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Should Insta360's <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a> be worried? Well, a threat is certainly looming, as the DJI Avata 360 rumors continue to ramp up. Fresh leaks suggest the drone could be coming <em>very </em>soon — and we might even see it in the next month or so. It looks like it will arrive in Spring 2026, even though I originally speculated that it would land at the end of December 2025.</p><p>But there are a few burning questions which won't be fully answered until we actually see the Avata 360. Will it be affordable, or at least cheaper than the Antigravity A1 (whose retail price makes it inaccessible to many)? Will it come with googles, like the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3</a>? And most importantly, will it be approved by <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">the FCC in the U.S., given the drone ban and restrictions</a>?</p><p>I've been keeping a close eye on the rumors, and the latest leaks have been quite enlightening. Here's everything you need to know about the DJI Avata 360.</p><h2 id="how-long-has-the-dji-avata-360-been-rumored">How long has the DJI Avata 360 been rumored?</h2><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="eAGTMnc2Non2XeDv2UHkL5" name="Avata-2-" alt="DJI Avata 2" src="https://cdn.mos.cms.futurecdn.net/eAGTMnc2Non2XeDv2UHkL5.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">DJI Avata 2. </span><span class="credit" itemprop="copyrightHolder">(Image credit: DJI)</span></figcaption></figure><p>The latest leaks aren't the first time we've heard of the DJI Avata 360. Back in May 2025, when the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a> were being speculated upon, a rumor started circulating around the internet, noting that a successor to the <a href="https://www.tomsguide.com/cameras-photography/drones/i-flew-the-dji-avata-2-for-an-entire-month-heres-what-i-wish-i-knew-beforehand">DJI Avata 2</a> would be launching soon. This hinted at the DJI Avata 3, and not the Avata 360.</p><p>Fast forward to August 2025 when Chinese media reported that DJI was also preparing a 360-degree drone. This rumor reared its face shortly after Antigravity, a drone brand "incubated" by Insta360, first teased the Antigravity A1. This also aligned with the launch of the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review">DJI Osmo 360</a>, DJI's first-ever 360-degree camera. DJI finally had the 360 tech it could potentially implement in its drones — after all, the Antigravity A1's imaging tech is quite similar to that in the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x5-review">Insta360 X5</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="7KEjgsXekY93gWWY7EQGWK" name="Antigravity_A1_ 8.JPG" alt="An Antigravity A1 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/7KEjgsXekY93gWWY7EQGWK.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Antigravity A1. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Given that Insta360 and DJI are two of the biggest players in the realm of action cameras and drones, it's only natural for them to compete. The subsequent launch of the Antigravity A1 in December 2025 meant one thing: the DJI Avata 360 could land at any moment. I myself was convinced that we'd see it before the end of 2025, but December also brought with it the <a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">FCC ruling which would ban the launch of new foreign-made drones</a>.</p><p>The FCC ruling doesn't affect the sale of already-existing drones, so you can still buy them, but any foreign-made drones that want to enter the American market will go through enhanced scrutiny. Even if drones are made on American soil but utilize foreign-made parts, they will still be scrutinized. This ruling, naturally, doesn't affect other countries, like the U.K., Australia, and nations in Europe and Asia. But it remains to be seen the impact it will have on the subsequent launch of the DJI Avata 360.</p><h2 id="the-dji-avata-360-will-be-relatively-affordable-according-to-leaks">The DJI Avata 360 will be relatively affordable, according to leaks</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qSbU3PJ3UHaSFeUyByqywG" name="DJI-Avata-360-rumor" alt="Speculated DJI Avata 360 pricing" src="https://cdn.mos.cms.futurecdn.net/qSbU3PJ3UHaSFeUyByqywG.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DroneXL)</span></figcaption></figure><p>There's no sugarcoating it: the world's first-ever 360-degree drone is very expensive. The Antigravity A1 starts at a whopping <a href="https://www.adorama.com/agde00101.html" target="_blank" rel="nofollow">$1,599</a> / <a href="https://www.cliftoncameras.co.uk/antigravity-a1-8k-360-drone-standard-bundle/" target="_blank" rel="nofollow">£1,219</a> and goes all the way up to <a href="https://www.adorama.com/agde00103.html" target="_blank" rel="nofollow">$1,999</a> / <a href="https://www.cliftoncameras.co.uk/antigravity-a1-8k-360-drone-infinity-bundle" target="_blank" rel="nofollow">£1,499</a>, so it isn't exactly affordable. DJI has the chance to undercut it by pricing the DJI Avata 360 competitively and at a lower price point — and it looks like that's exactly what the manufacturer intends to do.</p><p><a href="https://dronexl.co/2026/02/14/real-dji-avata-360-leaks-video-promo-release/" target="_blank" rel="nofollow">DroneXL was the first media outlet to report on the Avata 360 rumors</a>, and as you can see in the image above, DJI looks set to undercut Antigravity. If these rumors are true, the drone alone would cost ¥2,988 (approximately $499); the RC-2 bundle would cost ¥3,988 (approximately $699); the Fly More Combo would cost ¥5,688 (approximately $999); and the Goggles N3 Combo would cost approximately $1,200.</p><p>As DroneXL notes, these are estimations, and we can expect some fluctuation. The Avata 360 could even launch at the Avata 2's launch price. If these rumors are true — and as with any rumors, that's a big "if" — Antigravity could be in trouble, as the most expensive Avata 360 bundle would still be $300 cheaper than Antigravity's cheapest!</p><h2 id="it-could-potentially-shoot-8k-60fps">It could potentially shoot 8K/60fps</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:713px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qSbU3PJ3UHaSFeUyByqywG" name="DJI-Avata-360-rumor" alt="Speculated DJI Avata 360 pricing" src="https://cdn.mos.cms.futurecdn.net/v2/t:475,l:0,cw:713,ch:401,q:80/qSbU3PJ3UHaSFeUyByqywG.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DroneXL)</span></figcaption></figure><p>We haven't seen much in terms of the DJI Avata 360's specs in the latest leaks and rumors, so it remains to be seen what its sensor size will be, along with the megapixels it will pack. We don't know how much it will weigh either, but given DJI's track record of keeping most of its drones under the 8.78oz / 249g mark, we can assume that pilots will be able to fly the Avata 360 without necessarily registering it with the FCC in the U.S. or the CAA in the U.K.</p><p>We do have one somewhat confirmed spec though. In the above image <a href="https://dronexl.co/2026/02/14/real-dji-avata-360-leaks-video-promo-release/" target="_blank">shared by DroneXL</a>, it looks like the Avata 360 will be able to shoot 8K/60fps HDR Panorama Video. The Antigravity A1's video capabilities are limited to 8K/30fps, so this will give DJI a bit of a leg-up.</p><p>Many supposed images of the Avata 360 have been leaked online, too, but as with anything in the age of generative AI, I'm quite skeptical of these. You can never really know what's real and what's fake until you actually see it from an official source — so I will wait until DJI actually confirms the Avata 360 before sharing any product images.</p><h2 id="when-can-i-buy-the-dji-avata-360">When can I buy the DJI Avata 360?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UnipagBjV2JLqbQwuofkRi" name="DJI_Neo_2_ 9.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/UnipagBjV2JLqbQwuofkRi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">DJI Neo 2. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It's difficult to say when exactly you'll be able to buy the DJI Avata 360, as there has been no official news about the drone, and it hasn't even been teased by DJI yet. The latest leaks, though, suggest that the drone could potentially <strong>launch as early as March 2026</strong>. This is just a rumor at the end of the day, of course, so take it with a grain of salt.</p><p>As always, I'll be bringing you the latest news on the Avata 360, whenever DJI decides on announcing and revealing it, so keep your eyes peeled. In the meantime, if you're looking to buy a new drone in the U.S. and are worried about the FCC ban, the following are still available:</p><ul><li><strong>DJI Mavic 4 Pro: </strong><a href="https://www.amazon.com/DJI-Tri-Camera-Hasselblad-Professionals-Transmission/dp/B0DS2HDF1M/" target="_blank" rel="nofollow"><strong>was $2,699 now $2,179 @ Amazon</strong></a></li><li><strong>DJI Mini 5 Pro: </strong><a href="https://www.amazon.com/DJI-Ultra-Light-Omnidirectional-ActiveTrack-Transmission/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow"><strong>$759 @ Amazon</strong></a></li><li><strong>DJI Air 3S (with RC-N3): </strong><a href="https://www.amazon.com/DJI-Wide-Angle-Nightscape-Omnidirectional-Batteries/dp/B07FVZFX73/" target="_blank" rel="nofollow"><strong>$1,099 @ Amazon</strong></a></li><li><strong>DJI Neo 2:</strong><a href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><strong> $259 @ Amazon</strong></a></li><li><strong>DJI Neo: </strong><a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow"><strong>$199 @ Amazon</strong></a></li><li><strong>DJI Flip (with RC-N3): </strong><a href="https://www.amazon.com/DJI-Stabilization-44000ft-Transmission-Intelligent/dp/B0DJ1H6KCP/" target="_blank" rel="nofollow"><strong>$439 @ Amazon</strong></a></li><li><strong>DJI Avata 2 (Fly More Combo): </strong><a href="https://www.amazon.com/DJI-Immersive-Experience-Acrobatics-Propeller/dp/B0FS11M69S/" target="_blank" rel="nofollow"><strong>was $729 now $619 @ Amazon</strong></a></li></ul><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ePjG2O"></div>                            </div>                            <script src="https://kwizly.com/embed/ePjG2O.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/cameras-photography/drones/us-drone-ban-update">Restrictions on drones have been temporarily eased but there's a catch — here are the updates on the US drone ban</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2026</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-exclusive-developer-interview">“What if drones became an extension of our senses?”: I spoke with the Antigravity A1’s product lead about the brand’s inspirations, hopes and challenges</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Save some cash! DJI's best value action camera is $50 off right now for Presidents' Day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/save-some-cash-djis-best-value-action-camera-is-usd50-off-right-now-for-presidents-day</link>
                                                                            <description>
                            <![CDATA[ Pick up the awesome DJI Osmo Action 5 Pro at a hefty discount ahead of Presidents' Day. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">AzBvVUej9sizNQiPcbwgEF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6R4QZunxoayoMUtk7fR8SG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 13 Feb 2026 10:57:39 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6R4QZunxoayoMUtk7fR8SG-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Osmo Action 5 Pro on a selfie stick against a blue sky with a TG presidents&#039; day badge in the bottom left of the image]]></media:description>                                                            <media:text><![CDATA[DJI Osmo Action 5 Pro on a selfie stick against a blue sky with a TG presidents&#039; day badge in the bottom left of the image]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Osmo Action 5 Pro on a selfie stick against a blue sky with a TG presidents&#039; day badge in the bottom left of the image]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6R4QZunxoayoMUtk7fR8SG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Presidents' Day can be a great time to score deals on new tech as manufacturers drop prices to capitalize on the national holiday. And there are some strong deals to be found on the <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action cameras</a>, like the <a href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" target="_blank" rel="nofollow">DJI Osmo Action 5 Pro, which is currently $50 off at Amazon</a>.</p><p>With the launch of the new Osmo Action 6, you may be thinking that the older model is outdated, but you'd be wrong. I've tested both and, dollar for dollar, I think the Osmo Action 5 Pro is still the best value for money of the two.</p><div class="product"><a data-dimension112="3855ad5f-2536-4f63-9034-27cae163342f" data-action="Deal Block" data-label="The DJI Osmo Action 5 Pro packs huge performance for the money. 4K at up to 120fps, excellent internal audio, strong battery life and beautiful OLED displays. It's waterproof to 65 feet, meaning the OA5 Pro is more rugged than any GoPro." data-dimension48="The DJI Osmo Action 5 Pro packs huge performance for the money. 4K at up to 120fps, excellent internal audio, strong battery life and beautiful OLED displays. It's waterproof to 65 feet, meaning the OA5 Pro is more rugged than any GoPro." data-dimension25="$289" href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" 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:84.00%;"><img id="ZjbfZ45E3afFQJCzAjxoiM" name="DJI OA5P QUICK LIST" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZjbfZ45E3afFQJCzAjxoiM.jpg" mos="" align="middle" fullscreen="" width="500" height="420" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Osmo Action 5 Pro packs huge performance for the money. 4K at up to 120fps, excellent internal audio, strong battery life and beautiful OLED displays. It's waterproof to 65 feet, meaning the OA5 Pro is more rugged than any GoPro.<a class="view-deal button" href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" target="_blank" rel="nofollow" data-dimension112="3855ad5f-2536-4f63-9034-27cae163342f" data-action="Deal Block" data-label="The DJI Osmo Action 5 Pro packs huge performance for the money. 4K at up to 120fps, excellent internal audio, strong battery life and beautiful OLED displays. It's waterproof to 65 feet, meaning the OA5 Pro is more rugged than any GoPro." data-dimension48="The DJI Osmo Action 5 Pro packs huge performance for the money. 4K at up to 120fps, excellent internal audio, strong battery life and beautiful OLED displays. It's waterproof to 65 feet, meaning the OA5 Pro is more rugged than any GoPro." data-dimension25="$289">View Deal</a></p></div><p>Although I'm lucky enough to test lots of new tech, I'm a big believer in the mantra that newer isn't always better. Now, the latest DJI Osmo Action 6 is technically a better camera than the Osmo Action 5 Pro, but I'm not sure the changes warrant the upgrade or extra spend for many people.</p><p>Unless you need to switch lenses, I'd personally suggest you save your hard-earned cash and buy the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review">DJI Osmo Action 5 Pro</a>. Especially with this deal!</p><p>The OA5 Pro packs the same 4K recording, strong internal audio and even uses the same batteries. Its waterproof rating is the same as the newer model, too, at 65 feet. The major differences are that the newer OA6 has slightly boosted internal storage, variable lens aperture and the ability to switch lenses. Will most people need those things? Probably not desperately. While the OA6 will have deliver some slight improvements to video performance, it's minor, and the cameras' core performance is very similar.</p><p>This isn't the lowest price I've seen the Osmo Action 5 Pro, but realistically it's only going to drop to rock bottom around the Black Friday sales events in November, so this deal is still worth scooping up if you need an action camera now.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ This is the first time the DJI Mini 5 Pro has received such a massive price cut ($500 off!) — and it's the only drone I recommend buying this Presidents' Day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/ive-taken-some-of-my-best-aerial-images-on-the-dji-mini-5-pro-and-itll-take-your-videography-to-the-next-level-too-its-the-only-drone-i-recommend-buying-this-presidents-day</link>
                                                                            <description>
                            <![CDATA[ The DJI Mini 5 Pro is the most advanced mini drone yet, with a plethora of safety features and incredible image and video quality. Right now, it's $500 off! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kyKr393ih4NHjWmSH2UBvP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/yMoq4wdkhVatdp7yJA6GVF-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 12 Feb 2026 11:10:45 +0000</pubDate>                                                                                                                                <updated>Fri, 13 Feb 2026 11:52:23 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/yMoq4wdkhVatdp7yJA6GVF-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Mini 5 Pro mini drone]]></media:description>                                                            <media:text><![CDATA[A DJI Mini 5 Pro mini drone]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Mini 5 Pro mini drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/yMoq4wdkhVatdp7yJA6GVF-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As someone who reviews the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> for a living. The one drone I recommend regardless of your level of expertise? The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>. If you've been saving up for a new drones or are looking to grab one in light of the fact that <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">future DJI drones may not be authorized to be released in the U.S.</a>, now's the time to do it.</p><p>You see, Presidents' Day is almost upon us, and many retailers introduce massive discounts on lots of products this time of the year. I've found an absolutely killer deal on the Mini 5 Pro for you. The <a href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K/" target="_blank" rel="nofollow">DJI Mini 5 Pro Fly More Combo is currently 31% off at Amazon</a>, so you can save $500 on it right now.</p><p>This is the biggest discount I've seen on DJI's flagship drone, one that launched only in October of last year. I've thoroughly flown and reviewed the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">Mini 5 Pro</a> and I'm here to tell you that this is the only drone you need to buy.</p><div class="product"><a data-dimension112="2ab89202-d405-45eb-9901-2cae28880dc8" data-action="Deal Block" data-label="The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension48="The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension25="$1099" href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K/" 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:80.53%;"><img id="kdYGJWAztUs2zozBMcEBXb" name="M5P-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/kdYGJWAztUs2zozBMcEBXb.jpg" mos="" align="middle" fullscreen="" width="1500" height="1208" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor.<a class="view-deal button" href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K/" target="_blank" rel="nofollow" data-dimension112="2ab89202-d405-45eb-9901-2cae28880dc8" data-action="Deal Block" data-label="The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension48="The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension25="$1099">View Deal</a></p></div><p>The Mini 5 Pro is a formidable mini drone, and as it weighs 8.81oz, you don't necessarily need to register it with the FCC to fly it. It takes incredible aerial videos and images with its large 1-inch sensor (seen for the first time on a mini drone), and it offers up to 14-stops of dynamic range for better low-light performance and freedom in post-production.</p><p>When it comes to image and video quality, the Mini 5 Pro doesn't disappoint. It captures beautiful and highly detailed 50MP images as well as smooth and stable 4K/60fps video. This is further bolstered by the drone's three-axis mechanical gimbal and ability to withstand winds up to 12 m/s (26.84mph), so you can fly in quite windy conditions without impacting video quality.</p><p>For beginner drone pilots and even veterans, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-safety-features">Mini 5 Pro packs a host of safety features</a>, such as omnidirectional obstacle avoidance supplemented with forward-facing LiDAR which means that drone can detect objects even in low-light environments. It can even return home when there's no GPS!</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iVSrVbW87p0" allowfullscreen></iframe></div></div><p>In addition to all of this, the Mini 5 Pro borrows the 225° rotating gimbal from its bigger (and pricier) sibling, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">Mavic 4 Pro</a>. This enables flexible and dynamic camera movement as well as wide-angle rotation, which gives you lots of creative flexibility when shooting video or snapping images.</p><p>If there's only one drone you buy this Presidents' Day — or this year, even — make it the Mini 5 Pro. It's my favorite mini drone (and I've tested nearly all of them), and I can't recommend it enough if you want best-in-class image and video quality as well as safety features.</p><p>The Mini 5 Pro Fly More Combo includes the RC-2 touchscreen controller, three Intelligent Flight Batteries, a shoulder bag, and more goodies. Right now, it's the cheapest it has even been — yes, even cheaper than Black Friday — and you can grab it for just <a href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K/" target="_blank" rel="nofollow">$1,099 at Amazon</a>!</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro review: A new gold standard for mini drones</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">Restrictions on drones have been temporarily eased but there's a catch — here are the updates on the US drone ban</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-safety-features">The DJI Mini 5 Pro has the best safety features for beginners, and their importance can’t be overstated</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ You can still buy DJI drones in the US — here are the top-rated ones still available, including the Mini 5 Pro and the Mavic 4 Pro ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-drones-still-available-to-buy-usa-february-26</link>
                                                                            <description>
                            <![CDATA[ The FCC in the US introduced a ban on foreign-made drones at the tail-end of last year, but you can still buy these top-rated DJI drones right now. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Dm3pPZCyoJKrHbBERDbLWU</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/WjUoWoXkvsxr5CbCGNmSaL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 07 Feb 2026 10:15:00 +0000</pubDate>                                                                                                                                <updated>Mon, 09 Feb 2026 09:47:05 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/WjUoWoXkvsxr5CbCGNmSaL-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Flip - Taking off from hand]]></media:description>                                                            <media:text><![CDATA[DJI Flip - Taking off from hand]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Flip - Taking off from hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/WjUoWoXkvsxr5CbCGNmSaL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Towards the tail-end of last year, the Federal Communications Commission (FCC) in the U.S. announced that it would <a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">implement a ban on new foreign-made drones</a> — specifically those made by Chinese manufacturers. The brand that will be most impacted by this is DJI, the global leader when it comes to quadcopters.</p><p>When DJI announces its next drone, it might not be available in the U.S. — <a href="https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update">unless it passes "rigorous cyber and hardware assessments,"</a> according to the <a href="https://www.fcc.gov/files/nsd-fcc-covered-list-waiver-0126" target="_blank" rel="nofollow">NSD FCC Covered List Waiver 0126</a> which was released last month. But just because future drones are impacted, it doesn't mean already-existing ones are too. All the DJI drones that launched last year are <em>still </em>available to buy, so you're in luck, and this might be one of your last chances to get one.</p><p>I have flown and reviewed every drone on this list, so I can attest to the fact that they are all worth the money. The <a href="https://www.amazon.com/DJI-Tri-Camera-Hasselblad-Professionals-Transmission/dp/B0DS2HDF1M/" target="_blank" rel="nofollow">DJI Mavic 4 Pro ($2,199)</a> and the <a href="https://www.amazon.com/DJI-Ultra-Light-Omnidirectional-ActiveTrack-Transmission/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">DJI Mini 5 Pro ($759)</a>, for instance, are the only two drones I've ever given 5/5 star ratings to, and they're both still around, available to buy through Amazon. Read on to find out which other DJI drones you can still buy in the U.S.!</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong>DJI Mavic 4 Pro: </strong><a href="https://www.amazon.com/DJI-Tri-Camera-Hasselblad-Professionals-Transmission/dp/B0DS2HDF1M/" target="_blank" rel="nofollow"><strong>was $2,699 now $2,199 @ Amazon</strong></a></li><li><strong>DJI Mini 5 Pro: </strong><a href="https://www.amazon.com/DJI-Ultra-Light-Omnidirectional-ActiveTrack-Transmission/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow"><strong>$759 @ Amazon</strong></a></li><li><strong>DJI Air 3S (with RC-N3): </strong><a href="https://www.amazon.com/DJI-Wide-Angle-Nightscape-Omnidirectional-Batteries/dp/B07FVZFX73/" target="_blank" rel="nofollow"><strong>$1,099 @ Amazon</strong></a></li><li><strong>DJI Neo 2:</strong><a href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><strong> $259 @ Amazon</strong></a></li><li><strong>DJI Neo: </strong><a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow"><strong>$199 @ Amazon</strong></a></li><li><strong>DJI Flip (with RC-N3): </strong><a href="https://www.amazon.com/DJI-Stabilization-44000ft-Transmission-Intelligent/dp/B0DJ1H6KCP/" target="_blank" rel="nofollow"><strong>$439 @ Amazon</strong></a></li><li><strong>DJI Avata 2 (Fly More Combo): </strong><a href="https://www.amazon.com/DJI-Immersive-Experience-Acrobatics-Propeller/dp/B0FS11M69S/" target="_blank" rel="nofollow"><strong>was $729 now $619 @ Amazon</strong></a></li></ul><h2 class="article-body__section" id="section-drones-you-can-still-buy"><span>Drones you can still buy</span></h2><div class="product"><a data-dimension112="3c490cf2-a0f6-4453-9e5e-83bbd925e2fb" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2199" href="https://www.amazon.com/DJI-Tri-Camera-Hasselblad-Professionals-Transmission/dp/B0DS2HDF1M/" 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:78.87%;"><img id="FLhhHkzuKaHKo4MFwNfgDC" name="DJI Mavic 4 Pro" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/FLhhHkzuKaHKo4MFwNfgDC.jpg" mos="" align="middle" fullscreen="" width="1500" height="1183" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review" data-dimension112="3c490cf2-a0f6-4453-9e5e-83bbd925e2fb" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2199">DJI Mavic 4 Pro</a> is the best consumer drone money can buy right now, period. It improves on its predecessor by introducing 6K/60fps video, 100MP stills powered by a Hasselblad camera, and a brand new RC Pro 2 controller that makes flying a breeze. With a long flight time and 5-star performance across the board, it’s the ideal drone for commercial and personal use — as long as you don’t mind the weight restrictions.<a class="view-deal button" href="https://www.amazon.com/DJI-Tri-Camera-Hasselblad-Professionals-Transmission/dp/B0DS2HDF1M/" target="_blank" rel="nofollow" data-dimension112="3c490cf2-a0f6-4453-9e5e-83bbd925e2fb" data-action="Deal Block" data-label="DJI Mavic 4 Pro" data-dimension48="DJI Mavic 4 Pro" data-dimension25="$2199">View Deal</a></p></div><div class="product"><a data-dimension112="1c5f4412-52af-4988-9b29-f091d920eee6" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$759" href="https://www.amazon.com/DJI-Ultra-Light-Omnidirectional-ActiveTrack-Transmission/dp/B0F6XJ7W9M/" 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:94.80%;"><img id="oey3DVjRPNTJAX3h9syZuD" name="DJI-Mini-5-Pro deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oey3DVjRPNTJAX3h9syZuD.jpg" mos="" align="middle" fullscreen="" width="1500" height="1422" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review" data-dimension112="1c5f4412-52af-4988-9b29-f091d920eee6" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$759">DJI Mini 5 Pro</a> sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor.<a class="view-deal button" href="https://www.amazon.com/DJI-Ultra-Light-Omnidirectional-ActiveTrack-Transmission/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow" data-dimension112="1c5f4412-52af-4988-9b29-f091d920eee6" data-action="Deal Block" data-label="DJI Mini 5 Pro" data-dimension48="DJI Mini 5 Pro" data-dimension25="$759">View Deal</a></p></div><div class="product"><a data-dimension112="599eec42-0d00-42c3-b2f9-d2060a8078d5" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1099" href="https://www.amazon.com/DJI-Wide-Angle-Nightscape-Omnidirectional-Batteries/dp/B07FVZFX73/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="dvdBuBKqFVm6DVzxaXfGJn" name="DJI-Air-3S-deal-box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dvdBuBKqFVm6DVzxaXfGJn.jpg" mos="" align="middle" fullscreen="" width="2560" height="2560" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The new <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review" data-dimension112="599eec42-0d00-42c3-b2f9-d2060a8078d5" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1099">DJI Air 3S</a> is an outstanding drone with a dual-camera system that lets aerial videographers and travel photographers capture wide-angle and medium telephoto shots. With a large 1-inch sensor, next-gen obstacle avoidance, 42GB internal storage, and superb low-light performance, this is the best 4K/60fps drone money can buy right now. <a class="view-deal button" href="https://www.amazon.com/DJI-Wide-Angle-Nightscape-Omnidirectional-Batteries/dp/B07FVZFX73/" target="_blank" rel="nofollow" data-dimension112="599eec42-0d00-42c3-b2f9-d2060a8078d5" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1099">View Deal</a></p></div><div class="product"><a data-dimension112="33621c1e-19ca-4542-8835-da491207bd7f" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259" href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1066px;"><p class="vanilla-image-block" style="padding-top:73.17%;"><img id="qR2QDyEkqYwvExK2rTT6Qe" name="DJI-Neo-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qR2QDyEkqYwvExK2rTT6Qe.png" mos="" align="middle" fullscreen="" width="1066" height="780" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review" data-dimension112="33621c1e-19ca-4542-8835-da491207bd7f" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259">DJI Neo 2</a> is the best budget drone on the market right now, upstaging its predecessor in every way and doing so at (still) a low price point. Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, it makes an already formidable drone a must-have for all pilots.<a class="view-deal button" href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow" data-dimension112="33621c1e-19ca-4542-8835-da491207bd7f" data-action="Deal Block" data-label="DJI Neo 2" data-dimension48="DJI Neo 2" data-dimension25="$259">View Deal</a></p></div><div class="product"><a data-dimension112="834beb73-79b0-4116-9074-abad8a022c59" data-action="Deal Block" data-label="DJI Neo" data-dimension48="DJI Neo" data-dimension25="$199" href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" 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="ftPxFuwMzcEkXSjmxkyvDA" name="DJI Neo" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ftPxFuwMzcEkXSjmxkyvDA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A lightweight, compact and minimalistic drone, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review" data-dimension112="834beb73-79b0-4116-9074-abad8a022c59" data-action="Deal Block" data-label="DJI Neo" data-dimension48="DJI Neo" data-dimension25="$199">DJI Neo</a> is a fantastic drone that can shoot 4K footage at 30fps, take detailed stills, and remain stable in tricky conditions. Easy to control with the new RC-N3 controller or the DJI Fly app on a smartphone, the Neo makes drone photography more accessible thanks to its low price point.<a class="view-deal button" href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow" data-dimension112="834beb73-79b0-4116-9074-abad8a022c59" data-action="Deal Block" data-label="DJI Neo" data-dimension48="DJI Neo" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="b778debe-dcdd-4cf4-a7f5-520384ecdab1" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$439" href="https://www.amazon.com/DJI-Stabilization-44000ft-Transmission-Intelligent/dp/B0DJ1H6KCP/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1438px;"><p class="vanilla-image-block" style="padding-top:100.14%;"><img id="ETuF4Lpck8ZdBpTP77vEiU" name="DJI Flip deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ETuF4Lpck8ZdBpTP77vEiU.png" mos="" align="middle" fullscreen="" width="1438" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review" data-dimension112="b778debe-dcdd-4cf4-a7f5-520384ecdab1" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$439">DJI Flip</a> is a solid mid-range drone, perfect for those looking to upgrade from older DJI models. It captures detailed 48MP stills in all lighting conditions, and records gorgeous 4K/60fps footage. It’s great for content creators as it features many shooting modes, plus it’s built really well and sports a slick design.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-44000ft-Transmission-Intelligent/dp/B0DJ1H6KCP/" target="_blank" rel="nofollow" data-dimension112="b778debe-dcdd-4cf4-a7f5-520384ecdab1" data-action="Deal Block" data-label="DJI Flip" data-dimension48="DJI Flip" data-dimension25="$439">View Deal</a></p></div><div class="product"><a data-dimension112="b1d9d72f-14c5-4a9c-93f6-63454150763c" data-action="Deal Block" data-label="DJI Avata 2" data-dimension48="DJI Avata 2" data-dimension25="$619" href="https://www.amazon.com/DJI-Immersive-Experience-Acrobatics-Propeller/dp/B0FS11M69S/" 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:56.07%;"><img id="zF5rpNba3z5QQZ3QjsxNXm" name="61VTNpkhkEL._AC_SL1500_.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/zF5rpNba3z5QQZ3QjsxNXm.jpg" mos="" align="middle" fullscreen="" width="1500" height="841" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/i-flew-the-dji-avata-2-for-an-entire-month-heres-what-i-wish-i-knew-beforehand" data-dimension112="b1d9d72f-14c5-4a9c-93f6-63454150763c" data-action="Deal Block" data-label="DJI Avata 2" data-dimension48="DJI Avata 2" data-dimension25="$619">DJI Avata 2 </a>Fly More Combo comes with everything you need for long-lasting FPV flying. The drone is easy to fly, thanks to the motion controller and FPV headset, and it gives you more control to navigate tight corners. This combo includes an Intelligent Flight Battery, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3</a>, the DJI RC Motion 3 controller, and spare propellers.<a class="view-deal button" href="https://www.amazon.com/DJI-Immersive-Experience-Acrobatics-Propeller/dp/B0FS11M69S/" target="_blank" rel="nofollow" data-dimension112="b1d9d72f-14c5-4a9c-93f6-63454150763c" data-action="Deal Block" data-label="DJI Avata 2" data-dimension48="DJI Avata 2" data-dimension25="$619">View Deal</a></p></div><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W2rm0W"></div>                            </div>                            <script src="https://kwizly.com/embed/W2rm0W.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/us/best-drones,review-2412.html">The best drones in 2026</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">U.S. bans foreign-made drones including those by DJI — here’s what it means for you</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-safety-features">The DJI Mini 5 Pro has the best safety features for beginners, and their importance can’t be overstated</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Restrictions on drones have been temporarily eased but there's a catch — here are the updates on the US drone ban ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/us-drone-ban-update</link>
                                                                            <description>
                            <![CDATA[ In December 2025, the FCC banned the sale of future foreign-made drones in the U.S. Since then, there have been a few developments. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ArbVHP88wYHjmSydnEZQM8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/q4YKzqZuSTfwr6zGv4GPaL-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 06 Feb 2026 05:45:00 +0000</pubDate>                                                                                                                                <updated>Fri, 06 Feb 2026 14:22:36 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/q4YKzqZuSTfwr6zGv4GPaL-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI MIni 4 Pro - Flying]]></media:description>                                                            <media:text><![CDATA[DJI MIni 4 Pro - Flying]]></media:text>
                                <media:title type="plain"><![CDATA[DJI MIni 4 Pro - Flying]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/q4YKzqZuSTfwr6zGv4GPaL-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>On December 23 2025, the Federal Communications Commission (FCC) in the U.S. announced that it would <a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">ban all new foreign-made drones</a>, including those by DJI. DJI, a Chinese manufacturer, has dominated the drone market for years now, and it is the brand worst-hit by this ban.</p><p>Since the tail-end of 2025, there have been a few new developments — some of them are hopeful too, especially for existing drone owners and non-American manufacturers. I test and review the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a>, so I have been keeping a close eye on the U.S. drone ban. Here's a rundown of what has happened since that fateful day.</p><h2 id="what-happened-on-december-23rd-2025">What happened on December 23rd 2025?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="oBEgKmDV9rG2CNoRxcEthN" name="DJI_mavic_4_Pro_ 1.JPG" alt="A dark grey DJI Mavic 4 Pro drone" src="https://cdn.mos.cms.futurecdn.net/oBEgKmDV9rG2CNoRxcEthN.jpg" mos="" align="middle" fullscreen="" width="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 foreign-made drone ban didn't just happen overnight. This ordeal has been going on for a couple of years now. In June 2024,<a href="https://www.tomsguide.com/cameras-photography/drones/dji-drone-sales-ban-just-passed-the-us-house-heres-what-happens-next"> the House of Representatives passed a ban on the sale of DJI drones</a> within the country. This also took place around the time <a href="https://www.tomsguide.com/computing/vpns/the-us-tiktok-ban-a-full-timeline">when the government started seriously considering banning TikTok</a> (also owned by a Chinese company).</p><p>After the June 2024 ruling, it then went to the Senate, and on December 23, 2025 — almost a year and a half after the House of Representatives vote — the FCC announced that future drones would not be available in the U.S. as and when they're released. This means that, for instance, the highly rumored DJI Avata 360 (to compete with the <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a>) would not make an appearance in American markets.</p><p>This ban doesn't just apply to drones, according to the <a href="https://docs.fcc.gov/public/attachments/DA-25-1086A1.pdf" target="_blank" rel="nofollow">Public Notice released by the FCC</a>. If a drone even uses foreign-made parts, it can be heavily scrutinized by the FCC and blocked from being released in the U.S. These parts can be anything: batteries, propellers, imaging sensors, etc.</p><p>Drones either made entirely on foreign soil or utilizing foreign-made parts will be added to a "Covered List" of entities pegged as "posing an unacceptable risk to the national security of the United States or the security and safety of United States persons."</p><h2 id="can-i-still-buy-drones-in-the-u-s">Can I still buy drones in the U.S.?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sbC7XJWfMPGDAFtAiHCkQi" name="DJI_Neo_2_ 11.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/sbC7XJWfMPGDAFtAiHCkQi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While this is a blow to U.S. consumers who may want to buy DJI's future drones, it's important to note that drones released prior to December 23, 2025 are still safe, and are still being sold in the American market. If a drone was registered with and authorized by the FCC before the ban, it is still available. The last DJI drone that was added to the list was the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> (launched in October) and the non-DJI <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a> (launched in December).</p><p>As of today, the following DJI drones are still available:</p><ul><li><strong>DJI Mavic 4 Pro: </strong><a href="https://www.amazon.com/DJI-Tri-Camera-Hasselblad-Professionals-Transmission/dp/B0DS2HDF1M/" target="_blank" rel="nofollow"><strong>was $2,699 now $2,199 @ Amazon</strong></a></li><li><strong>DJI Mini 5 Pro: </strong><a href="https://www.amazon.com/DJI-Ultra-Light-Omnidirectional-ActiveTrack-Transmission/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow"><strong>$759 @ Amazon</strong></a></li><li><strong>DJI Air 3S (with RC-N3): </strong><a href="https://www.amazon.com/DJI-Wide-Angle-Nightscape-Omnidirectional-Batteries/dp/B07FVZFX73/" target="_blank" rel="nofollow"><strong>$1,099 @ Amazon</strong></a></li><li><strong>DJI Neo 2:</strong><a href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><strong> $259 @ Amazon</strong></a></li><li><strong>DJI Neo: </strong><a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow"><strong>$199 @ Amazon</strong></a></li><li><strong>DJI Flip (with RC-N3): </strong><a href="https://www.amazon.com/DJI-Stabilization-44000ft-Transmission-Intelligent/dp/B0DJ1H6KCP/" target="_blank" rel="nofollow"><strong>$439 @ Amazon</strong></a></li><li><strong>DJI Avata 2 (Fly More Combo): </strong><a href="https://www.amazon.com/DJI-Immersive-Experience-Acrobatics-Propeller/dp/B0FS11M69S/" target="_blank" rel="nofollow"><strong>was $729 now $619 @ Amazon</strong></a></li></ul><h2 id="restrictions-have-been-temporarily-relaxed">Restrictions have been temporarily relaxed</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="HTb9PdTdXkphP7Vg5pxb2E" name="dji_mini_5_pro 9.JPG" alt="A DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/HTb9PdTdXkphP7Vg5pxb2E.jpg" mos="" align="middle" fullscreen="" width="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>Since the FCC ruling, there has been a new development. On January 7, 2026, a couple of weeks after the December 23rd ruling, the FCC released the <a href="https://www.fcc.gov/files/nsd-fcc-covered-list-waiver-0126" target="_blank" rel="nofollow">NSD FCC Covered List Waiver 0126</a> which mentions the "DCMA's Blue UAS list."</p><p>Page two of the document states that foreign-made drones (and components) may be allowed to be sold in the U.S. once they have gone through and passed "rigorous cyber and hardware assessments." These drones will then be allowed to remain available until January 1, 2027.</p><p>This also applies to any drones that are partially made on American soil. As long as drones meet the definition of "domestic end products" and have "at least 65%" of their components' costs come from the U.S., they can avoid the FCC ban.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WjUoWoXkvsxr5CbCGNmSaL" name="DJI Flip - Taking off from hand" alt="DJI Flip - Taking off from hand" src="https://cdn.mos.cms.futurecdn.net/WjUoWoXkvsxr5CbCGNmSaL.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But there's a catch. This rule applies only to drones designed for first responders, government agencies and task forces, search and rescue teams, and surveillance teams. This list does not include consumer drones designed primarily for photography, such as the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> or the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>.</p><p>While this doesn't sound ideal for consumer drones, I believe it is hopeful. There's no guarantee that this ban will remain in place forever, and as consumers, all we can do is hope that one day, DJI drones will be ably to fly freely in the U.S. once again.</p><h2 id="your-dji-drone-still-gets-firmware-updates">Your DJI drone still gets firmware updates</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XKqfv8uQTXHJ3bk9JV5aaL" name="DJI Neo - Holding in hand" alt="DJI Neo - Holding in hand" src="https://cdn.mos.cms.futurecdn.net/XKqfv8uQTXHJ3bk9JV5aaL.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" 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 currently own a DJI drone and are worried your quadcopter will stop receiving firmware updates, don't fret. The FCC has confirmed that existing foreign-made drones — including those from DJI, Autel and Potensic — will continue receiving firmware/software updates as well as security patches, at least until January 1, 2027.</p><p>In a <a href="https://docs.fcc.gov/public/attachments/DA-26-69A1.pdf" target="_blank" rel="nofollow">statement published by the FCC on January 21, 2026</a>, its Office of Engineering and Technology (OET) noted that though on December 22, 2025, it had decided to stop existing drones from receiving these critical updates, this has now been temporary waived.</p><p>There's another bit of hope here, as the FCC has confirmed that it will revisit the issue before the January 1, 2027 deadline. It has left the door open and has said that there could be a possibility — after detailed re-evaluation — of an extension to the deadline or working towards a more permanent framework.</p><p>This is all we know so far. As always, if there are any further updates, I'll be sure to cover them.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-X7rwDO"></div>                            </div>                            <script src="https://kwizly.com/embed/X7rwDO.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/cameras-photography/drones/dji-drones-still-available-to-buy-usa-february-26">DJI drones are still available in the U.S. — here are the top-rated ones you can buy right now</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2026</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">US bans foreign-made drones including those by DJI — here’s what it means for you</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Want to take up photography in 2026? These are the 5 beginner cameras I recommend ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/photography-hobby-beginner-cameras-i-recommend</link>
                                                                            <description>
                            <![CDATA[ Whether you want a camera for vlogging or casual video work, or one for taking photos of animals and birds, I've rounded up the finest beginner cameras. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">DcF3hy2pTLHBmHr5c9Rx4E</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/G6HnKMxfRMdG3djegepQUR-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 01 Jan 2026 10:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/G6HnKMxfRMdG3djegepQUR-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of digital, mirrorless, and bridge cameras]]></media:description>                                                            <media:text><![CDATA[A selection of digital, mirrorless, and bridge cameras]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of digital, mirrorless, and bridge cameras]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/G6HnKMxfRMdG3djegepQUR-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The year's drawing to a close and many of us are starting to wind down to enjoy the holidays and well-deserved breaks. This is the time of the year when many of us start coming up with New Year's resolutions, whether they're related to hitting the gym more often, quitting a bad habit, or picking up a new hobby.</p><p>You know what's a great hobby that I, personally, vouch for? Photography. It's a wonderful hobby that involves learning new skills and technical knowledge, as well as going outdoors, spending time in the natural elements. Photography can be very rewarding too — take it from someone who has been doing it since she was a child. Nothing beats the feeling when you grab a shot of, say, a bird, that you've been vying for for a long time.</p><p>I love photography as a hobby and it's also part of my job as senior reviews writer here at Tom's Guide, which means I test the <a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">best cameras</a>. If you want to take up photography as a hobby in 2026 but don't know which camera to get, I've got you covered.</p><h2 class="article-body__section" id="section-budget-pick"><span>Budget pick</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="URaqybaYd8Wco5ga9pMHPF" name="TG_Canon-EOS-R100-front_01.jpg" alt="Front view of Canon EOS R100" src="https://cdn.mos.cms.futurecdn.net/URaqybaYd8Wco5ga9pMHPF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Currently ranking as our top pick for <a href="https://www.tomsguide.com/us/best-mirrorless-cameras,review-2221.html#section-the-best-budget-mirrorless-camera">best budget mirrorless camera</a>, the Canon EOS R100 is a superb all-purpose camera. Whether you want to capture pet portraits, family group photos, or landscapes, this camera can do it all — and without burning a hole in your pocket too. It's the next step up from smartphone photography, thanks to its straightforward control scheme and compact and lightweight design.</p><p>Featuring a 24.1MP sensor, the EOS R100 captures lovely-looking stills which are perfect for sharing on social media. What makes this camera ideal for beginners is the 'Display Level' section of the menu which offers a Guided Menu display option, Interactive Mode guide, and a pop-up Feature guide. All of these help you find your way around the camera, and learn how to use different shooting modes. The EOS R100 teaches you photography, basically!</p><div class="product"><a data-dimension112="051e05ea-f99e-4582-abea-95c7b40fe0e4" data-action="Deal Block" data-label="Canon EOS R100 review" data-dimension48="Canon EOS R100 review" data-dimension25="$679" href="https://www.amazon.com/Canon-RF-S18-45mm-Mirrorless-Continuous-Lightweight/dp/B0C5PGRP7V/" 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="6HzdrJqTcyHq2WAGWo8uDA" name="EOS R100" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/6HzdrJqTcyHq2WAGWo8uDA.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>For beginners on a budget, the Canon EOS R100 is a fantastic choice and would make a fine gift too. In our <a href="https://www.tomsguide.com/reviews/canon-eos-r100" data-dimension112="051e05ea-f99e-4582-abea-95c7b40fe0e4" data-action="Deal Block" data-label="Canon EOS R100 review" data-dimension48="Canon EOS R100 review" data-dimension25="$679">Canon EOS R100 review</a>, we noted that this camera has a bare bones feature list, resulting in a compact, lightweight and relatively inexpensive camera. It’s simple to use yet capable of capturing excellent 24.1MP images and decent 4K video at 25p. If you're stepping up from a smartphone, you won't go wrong with the EOS R100.<a class="view-deal button" href="https://www.amazon.com/Canon-RF-S18-45mm-Mirrorless-Continuous-Lightweight/dp/B0C5PGRP7V/" target="_blank" rel="nofollow" data-dimension112="051e05ea-f99e-4582-abea-95c7b40fe0e4" data-action="Deal Block" data-label="Canon EOS R100 review" data-dimension48="Canon EOS R100 review" data-dimension25="$679">View Deal</a></p></div><p>The EOS R100 is an interchangeable lens camera (ILC) which means you can swap its lenses. It's compatible with Canon's RF-S (APS-C) and RF (full frame) lenses, giving you the freedom to experiment with different focal lengths, apertures and more. For a beginner camera, this is a great feature to have, as you can always invest in more advanced lenses down the line.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/26Cb7de3txdj4unQ9PexX4.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/FG9zKciyxxaGMQG6n9AtH3.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/7mrJMeHQHraNA37Nz78dMn.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/f8JtCWpAYeCp7ErWVwpYzk.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/mYry9sU8jQ5WPqGeEfp3xm.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RKt9EEbwHTLvm5KAiwsp6.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eDmFxaJ2oY8V4gHsrUiPW.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/R3UpB3iNvQHEa4pdM2ig65.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/SE4JJFigwyxBXRrpjhAXhn.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/uLienL3QWbxyqjLkML5rMo.jpg" alt="Canon EOS R100 sample image" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>For those who want to capture videos of their family, friends, pets and travels, the EOS R100 is up to the challenge as it can record 4K/25fps video too. It's the ultimate, beginner-friendly all-purpose camera, which is why I recommend it to every smartphone user looking to build on their photography skills.</p><p><em><strong>Check out more sample images and videos in our </strong></em><a href="https://www.tomsguide.com/reviews/canon-eos-r100"><em><strong>Canon EOS R100 review</strong></em></a><em><strong>.</strong></em></p><h2 class="article-body__section" id="section-video-work"><span>Video work</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LB2GLZFNqYmYVCgXNEgMXD" name="Fuji_xm5_16x9" alt="A Fujifilm X-M5 mirrorless vlogging camera in the silver colorway" src="https://cdn.mos.cms.futurecdn.net/LB2GLZFNqYmYVCgXNEgMXD.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you want a camera specifically designed for videography, and one that doesn't break the bank, I've got a great recommendation for you: the <a href="https://www.tomsguide.com/cameras-photography/fujifilm-x-m5-review">Fujifilm X-M5</a>. Similar to the Canon EOS R100, you can mount different lenses on to the X-M5, giving you more versatility and freedom. It's an excellent video and/or vlogging camera, thanks to its ability to record 6.2K/30fps footage. This resolution gives you some headroom to crop to 4K while maintaining a high resolution.</p><p>The X-M5 records 10-bit video, which means it’s capable of capturing a wide color gamut with a total of 1.07 billion individual hues. Fuji's color science is breathtaking so you know you're getting your money's worth. It's a versatile camera as it can shoot detailed, colorful 26.1MP stills too. Autofocus works well in both video and stills, as the camera is quick to lock onto animals and humans.</p><div class="product"><a data-dimension112="df682cf8-61b8-4c49-9a00-d288848ca4ec" data-action="Deal Block" data-label="The Fujifilm X-M5 is an excellent vlogging camera that lets you shoot vertical videos without turning the camera on its side, and 6.2K/30P 10-bit footage. Its 26.1MP sensor captures detailed stills, and the camera lets you apply 20 film simulations to both stills and video." data-dimension48="The Fujifilm X-M5 is an excellent vlogging camera that lets you shoot vertical videos without turning the camera on its side, and 6.2K/30P 10-bit footage. Its 26.1MP sensor captures detailed stills, and the camera lets you apply 20 film simulations to both stills and video." data-dimension25="$999" href="https://www.amazon.com/FUJIFILM-Mirrorless-Digital-Camera-XC15-45mmF3-5-5-6/dp/B0FC889452/" 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="vtcH67GJX2u6cHfwmqiQ3Q" name="X-M5-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vtcH67GJX2u6cHfwmqiQ3Q.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Fujifilm X-M5 is an excellent vlogging camera that lets you shoot vertical videos without turning the camera on its side, and 6.2K/30P 10-bit footage. Its 26.1MP sensor captures detailed stills, and the camera lets you apply 20 film simulations to both stills and video.<a class="view-deal button" href="https://www.amazon.com/FUJIFILM-Mirrorless-Digital-Camera-XC15-45mmF3-5-5-6/dp/B0FC889452/" target="_blank" rel="nofollow" data-dimension112="df682cf8-61b8-4c49-9a00-d288848ca4ec" data-action="Deal Block" data-label="The Fujifilm X-M5 is an excellent vlogging camera that lets you shoot vertical videos without turning the camera on its side, and 6.2K/30P 10-bit footage. Its 26.1MP sensor captures detailed stills, and the camera lets you apply 20 film simulations to both stills and video." data-dimension48="The Fujifilm X-M5 is an excellent vlogging camera that lets you shoot vertical videos without turning the camera on its side, and 6.2K/30P 10-bit footage. Its 26.1MP sensor captures detailed stills, and the camera lets you apply 20 film simulations to both stills and video." data-dimension25="$999">View Deal</a></p></div><p>What makes the X-M5 an absolute steal (in addition to its solid video and photo capabilities) is its compact size, making it a lovely travel companion, and dedicated film simulation dial. Film simulations are, essentially, filters which you can apply to videos and photos, and there are many different ones to choose from. These help you produce usable footage without the need for post-production — something beginners will definitely appreciate.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/DwRgPiFqR2c" allowfullscreen></iframe></div></div><p>For videography, the X-M5 boasts good audio performance too, thanks to a wind filter and three internal directional mics. You can choose to record surround sound, front or back priority, or front and back priority. The camera captures environmental, ambient sounds as well as human voices well, negating the need to buy an external mic right off the bat.</p><p><em><strong>Check out more sample images and videos in my </strong></em><a href="https://www.tomsguide.com/cameras-photography/fujifilm-x-m5-review"><em><strong>Fujifilm X-M5 review</strong></em></a><em><strong>.</strong></em></p><h2 class="article-body__section" id="section-vlogging-on-a-budget"><span>Vlogging on a budget</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FA3M3vaAVCYVeXqhCgtRrT" name="Sony_ZV_1F_12.JPG" alt="A black Sony ZV-1F compact vlogging camera" src="https://cdn.mos.cms.futurecdn.net/FA3M3vaAVCYVeXqhCgtRrT.jpg" mos="" align="middle" fullscreen="" width="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 best cameras can help elevate your content creation, and you don't necessarily need to spend thousands on one. If you're planning on picking up a camera specifically for vlogging (perhaps that's your New Year's resolution!), it's worth checking out the <a href="https://www.tomsguide.com/cameras-photography/sony-zv-1f-review">Sony ZV-1F</a>, which currently ranks as our <a href="https://www.tomsguide.com/us/best-cheap-cameras,review-6319.html#section-the-best-cheap-vlogging-camera">best cheap vlogging camera</a>.</p><p>Sony's beginner-friendly vlogging camera is extremely compact and portable, and easy to use. Firstly, it takes nice photos with its 20.1MP sensor, and there are a few color profiles/filters for you to play around with. It shoots great 4K/30fps footage and can shoot in S-Log 3 to capture a wider dynamic range for more freedom in post-production.</p><div class="product"><a data-dimension112="07c65346-b206-445c-8467-2cf226d01fa0" data-action="Deal Block" data-label="The Sony ZV-1F is a great vlogging camera that’s portable and doesn’t break the bank. It shoots lovely 4K/30P footage, can shoot in S-Log 3 to capture a wider dynamic range, and comes with handy vlogging features. Stills taken are good too as is the built-in mic." data-dimension48="The Sony ZV-1F is a great vlogging camera that’s portable and doesn’t break the bank. It shoots lovely 4K/30P footage, can shoot in S-Log 3 to capture a wider dynamic range, and comes with handy vlogging features. Stills taken are good too as is the built-in mic." data-dimension25="$499" href="https://www.amazon.com/Sony-Camera-Content-Creators-Vloggers/dp/B0BHKKHNHM/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:6693px;"><p class="vanilla-image-block" style="padding-top:75.00%;"><img id="M7gV4XnvVW7JurfkpNJYqf" name="01 ZV-1F_front_on_black.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/M7gV4XnvVW7JurfkpNJYqf.jpg" mos="" align="middle" fullscreen="" width="6693" height="5020" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Sony ZV-1F is a great vlogging camera that’s portable and doesn’t break the bank. It shoots lovely 4K/30P footage, can shoot in S-Log 3 to capture a wider dynamic range, and comes with handy vlogging features. Stills taken are good too as is the built-in mic.<a class="view-deal button" href="https://www.amazon.com/Sony-Camera-Content-Creators-Vloggers/dp/B0BHKKHNHM/" target="_blank" rel="nofollow" data-dimension112="07c65346-b206-445c-8467-2cf226d01fa0" data-action="Deal Block" data-label="The Sony ZV-1F is a great vlogging camera that’s portable and doesn’t break the bank. It shoots lovely 4K/30P footage, can shoot in S-Log 3 to capture a wider dynamic range, and comes with handy vlogging features. Stills taken are good too as is the built-in mic." data-dimension48="The Sony ZV-1F is a great vlogging camera that’s portable and doesn’t break the bank. It shoots lovely 4K/30P footage, can shoot in S-Log 3 to capture a wider dynamic range, and comes with handy vlogging features. Stills taken are good too as is the built-in mic." data-dimension25="$499">View Deal</a></p></div><p>The ZV-1F's prowess lies in its vlogging-specific features, which make it easy to create content. One of these is Product Showcase, where the ZV-1F automatically focuses on the subject close to the camera and blurs the background. This is a great tool for product reviews, for instance, where you want to put the object of your choice front and centre.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/F60cMMDna3k" allowfullscreen></iframe></div></div><p>There are many other vlogging features to be enjoyed, such as the built-in three-capsule mic with a windscreen for clear audio, Background Defocus for quick transitions, and more. If there's one camera you need to kick off your vlogging career, it's none other than the ZV-1F.</p><p><em><strong>Check out more sample images and videos in my </strong></em><a href="https://www.tomsguide.com/cameras-photography/sony-zv-1f-review"><em><strong>Sony ZV-1F review</strong></em></a><em><strong>.</strong></em></p><h2 class="article-body__section" id="section-wildlife"><span>Wildlife</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4jRXUe9ro3WRpf3GbTUgEo" name="Nikon_coolpix_ 12.JPG" alt="A black Nikon Coolpix P1100 digital camera" src="https://cdn.mos.cms.futurecdn.net/4jRXUe9ro3WRpf3GbTUgEo.jpg" mos="" align="middle" fullscreen="" width="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>My favorite non-human subjects to photograph are birds and animals. I love wildlife photography, so I'm always on the lookout for a camera that will help me achieve lovely shots. Thing is, proper wildlife cameras can be <em>really </em>expensive for many reasons, such as high-speed burst shooting, rapid autofocus, etc. <a href="https://www.tomsguide.com/cameras-photography/this-usd1-100-camera-beats-out-usd10-000-super-telephoto-lenses-for-wildlife-photography-and-ive-taken-some-of-my-best-photos-yet">Telephoto lenses designed to capture close-up shots of animals can easily cost you over ten grand</a>.</p><p>But wildlife photography doesn't <em>need</em> to be an expensive hobby, and for that reason, I recommend the <a href="https://www.tomsguide.com/cameras-photography/nikon-coolpix-p1100-review">Nikon Coolpix P1100</a>, a bridge camera featuring a 125x zoom with an effective optical focal range of 24-3000mm (and 6000mm with 4x digital zoom). Though its body is bulky (similar to DSLRs) and the ISO tops out at 6400 which means low-light performance isn't the best, this is still a fantastic camera to get for bird watching... and moon photography too!</p><div class="product"><a data-dimension112="180c30f9-173f-4a56-90ff-4241ef1746dd" data-action="Deal Block" data-label="The Nikon Coolpix P1100 is a bridge camera designed for photographing upwards, with dedicated Bird Watching and Moon modes, thanks to its 23-3000mm effective optical focal range. The camera is easy to use thanks to a straightforward control scheme, and although it’s bulky, its ergonomics make it easy to handle." data-dimension48="The Nikon Coolpix P1100 is a bridge camera designed for photographing upwards, with dedicated Bird Watching and Moon modes, thanks to its 23-3000mm effective optical focal range. The camera is easy to use thanks to a straightforward control scheme, and although it’s bulky, its ergonomics make it easy to handle." data-dimension25="$1146" href="https://www.amazon.com/Nikon-Superzoom-Stabilization-Connectivity-Rotating/dp/B0DWSYJLGJ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1430px;"><p class="vanilla-image-block" style="padding-top:104.90%;"><img id="tRnGvLyRLps54ECmDsWhbM" name="Coolpix P1100 deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/tRnGvLyRLps54ECmDsWhbM.jpg" mos="" align="middle" fullscreen="" width="1430" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Nikon Coolpix P1100 is a bridge camera designed for photographing upwards, with dedicated Bird Watching and Moon modes, thanks to its 23-3000mm effective optical focal range. The camera is easy to use thanks to a straightforward control scheme, and although it’s bulky, its ergonomics make it easy to handle.<a class="view-deal button" href="https://www.amazon.com/Nikon-Superzoom-Stabilization-Connectivity-Rotating/dp/B0DWSYJLGJ/" target="_blank" rel="nofollow" data-dimension112="180c30f9-173f-4a56-90ff-4241ef1746dd" data-action="Deal Block" data-label="The Nikon Coolpix P1100 is a bridge camera designed for photographing upwards, with dedicated Bird Watching and Moon modes, thanks to its 23-3000mm effective optical focal range. The camera is easy to use thanks to a straightforward control scheme, and although it’s bulky, its ergonomics make it easy to handle." data-dimension48="The Nikon Coolpix P1100 is a bridge camera designed for photographing upwards, with dedicated Bird Watching and Moon modes, thanks to its 23-3000mm effective optical focal range. The camera is easy to use thanks to a straightforward control scheme, and although it’s bulky, its ergonomics make it easy to handle." data-dimension25="$1146">View Deal</a></p></div><p>The Coolpix P1100's biggest selling point is its long-reaching zoom, which helps you get up close and personal with animals without actually disturbing their peace. The modest 16MP sensor captures plenty of detail with great color reproduction. There's a dedicated Bird Watching mode which toggles the continuous 7fps drive, so you can keep the shutter button pressed and the camera will capture seven frames. This is handy for capturing birds (or animals) in motion/action. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/7i8w6BiTy2dGrEknXhsH8C.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/rwHzUmMcPivafDMDFbks7C.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/5sKfQ5sVJQ22BNbzuH5CTB.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/8TE3pTxyMmW2GMx25tAzTB.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gBdiPrfkuKfGXxNgRprRvB.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eZPXfGj5Kubv8kFfaX6rhB.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TMZL2tKRYBHNBzPg9vo9xB.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/q8uXJXKQj6HAmrihqyqqwB.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/W2zSpKzTZ5S6zuYF7cKG6C.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/7gmXDRushR7NbWUaF7nG6C.jpg" alt="A photo taken on a Nikon Coolpix P1100 digital camera" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>The Coolpix P1100 handles well too, thanks to the chunky, ergonomic grip, as well as the well-placed controls. Speaking of, the Coolpix P1100 is very straightforward to control, so if you're a beginner, you should have no problem getting to grips with the camera's buttons and dials. If you don't want to spend thousands and thousands on a mirrorless camera and telephoto lens for wildlife photography, the Coolpix P1100 is the one to get.</p><p><em><strong>Check out more sample images and videos in my </strong></em><a href="https://www.tomsguide.com/cameras-photography/nikon-coolpix-p1100-review"><em><strong>Nikon Coolpix P1100 review.</strong></em></a></p><h2 class="article-body__section" id="section-aerial"><span>Aerial</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="udBDNmJfUzNMSN6wZRqgRi" name="DJI_Neo_2_ 12.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/udBDNmJfUzNMSN6wZRqgRi.jpg" mos="" align="middle" fullscreen="" width="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>Photography doesn't need to be restricted to just staying on the ground, of course. If you're interested in aerial photography, it's worth investing in one of the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> — and many doesn't cost thousands. For beginner pilots, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a> is the ideal choice. The Neo 2 is extremely easy to fly, either via a smartphone, controller or even hands-free via the buttons on its body and Gesture Control.</p><p>It's packed with powerful imaging tech too. For stills, you get a 12MP sensor which captures detailed shots, especially in bright conditions, and for video, you get smooth, stable 4K/60fps footage. But what makes the Neo 2 a downright incredible mini drone is its omnidirectional obstacle avoidance, which means it can either brake in front of or bypass obstacles — an invaluable safety feature for all pilots.</p><div class="product"><a data-dimension112="75cdb79a-8043-4b19-b9fd-37d50c2454d1" data-action="Deal Block" data-label="Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the DJI Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades." data-dimension48="Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the DJI Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades." data-dimension25="$259" href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1066px;"><p class="vanilla-image-block" style="padding-top:73.17%;"><img id="qR2QDyEkqYwvExK2rTT6Qe" name="DJI-Neo-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qR2QDyEkqYwvExK2rTT6Qe.png" mos="" align="middle" fullscreen="" width="1066" height="780" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the DJI Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades.<a class="view-deal button" href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow" data-dimension112="75cdb79a-8043-4b19-b9fd-37d50c2454d1" data-action="Deal Block" data-label="Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the DJI Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades." data-dimension48="Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the DJI Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades." data-dimension25="$259">View Deal</a></p></div><p>The Neo 2 is a wonderful selfie drone too. It features an array of QuickShot Intelligent Flight modes, where the drone takes photos or videos before returning to its takeoff position. These include Follow, Circle, Rocket, SelfieShot, and more, and they're great for hands-free shooting either solo or with other people.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/n6Gs9cwzSIk" allowfullscreen></iframe></div></div><p>If you want a drone that's easy to fly, is fit for beginners, allows you to capture stunning aerial footage via manual control, and one that's built extremely well, the Neo 2 should be your port of call. It'll help you take your first steps into the vast world of drone videography and may even convince you to spend more on an advanced quadcopter in the future!</p><p><em><strong>Check out more sample images and videos in my </strong></em><a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review"><em><strong>DJI Neo 2 review</strong></em></a><em><strong>.</strong></em></p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eP0M1e"></div>                            </div>                            <script src="https://kwizly.com/embed/eP0M1e.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/us/best-cameras,review-2196.html">Best cameras in 2025</a></li><li><a href="https://www.tomsguide.com/cameras-photography/this-usd1-100-camera-beats-out-usd10-000-super-telephoto-lenses-for-wildlife-photography-and-ive-taken-some-of-my-best-photos-yet">This $1,100 camera beats out $10,000 super telephoto lenses for wildlife photography, and I've taken some of my best photos yet</a></li><li><a href="https://www.tomsguide.com/cameras-photography/who-needs-a-viewfinder-heres-why-the-fujifilm-x-m5-is-the-only-camera-you-need-to-buy">I ditched my Google Pixel 7 Pro for the new Fujifilm X-M5 — here's why I won't be going back</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ What will drones look like in 2026? Here are my predictions on what we could see from DJI, Antigravity and others ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/what-will-drones-look-like-in-2026</link>
                                                                            <description>
                            <![CDATA[ 2025 has been a great year for drones and 2026 could be better. From 360° drones to waterproof ones, here's what the new year could bring. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CTWwbveaVJB9gRACyCajRo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/xX75nu4M5aewBdKGNPzzgV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 31 Dec 2025 08:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/xX75nu4M5aewBdKGNPzzgV-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Mini 5 Pro and Antigravity A1 Vision goggles side-by-side]]></media:description>                                                            <media:text><![CDATA[A DJI Mini 5 Pro and Antigravity A1 Vision goggles side-by-side]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Mini 5 Pro and Antigravity A1 Vision goggles side-by-side]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/xX75nu4M5aewBdKGNPzzgV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If there's anything we've learned from 2025, it's that consumer drones are evolving rapidly and that there are still unchartered territories for manufacturers to explore. 2025 saw the introduction of the most powerful and safest mini quadcopter yet, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>, as well as the most advanced camera drone yet, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a>, with its 100MP Hasselblad camera and the ability to shoot 6K/30fps video.</p><p>This year also introduced a new drone category, and one that's never been done before. The <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a> became the world's first-ever 360° drone, utilizing the same cutting-edge tech found in the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x5-review">Insta360 X5</a> camera. But it wasn't just the skies drones continued to dominate: the HoverAir Aqua became the world's first waterproof drone, making it perfect for water sports.</p><p>But could 2026 top 2025 when it comes to drones? As someone who tests the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> day in and day out, I can't wait to see what the coming year holds. Given that excitement, I thought I'd write down my predictions for 2026, and it'll be fun to look back on it and see what came true.</p><p><em>All of this is speculation, and information in this article should be taken with a pinch of salt.</em></p><p>On December 23, 2025, the <a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">FCC banned the import and sale of any new foreign-made drones and components</a>, noting that any entity "posing an unacceptable risk to the national security of the United States or the security and safety of United States persons" would be added to a "Covered List" going forward. Consumers anywhere else, outside of the U.S., will <em>still</em> be able to buy new drones from foreign manufacturers.</p><h2 id="prediction-1-more-3600-drones">Prediction #1: More 360° drones</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/7KEjgsXekY93gWWY7EQGWK.jpg" alt="An Antigravity A1 360-degree drone" /><figcaption>Antigravity A1, Vision Goggles, and Grip Controller.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/NMmWhT39D2JcubNyvAwPJi.jpg" alt="A person wearing the DJI Goggles N3 FPV headset in a dary gray colorway and holding a DJI RC Motion 3 controller" /><figcaption>DJI Goggles N3 and DJI RC Motion 3 Controller.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Antigravity is a new brand "incubated" by Insta360. Insta360 is one of the <a href="https://www.tomsguide.com/us/best-360-cameras,review-3737.html">best 360 camera</a> brands, with an unchecked dominance over the 360 camera market for the last few years. Until now. In July, DJI launched its first-ever 360° camera, the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review">DJI Osmo 360</a>, perhaps in anticipation of the Antigravity A1 (which was heavily rumored back then). GoPro also decided to play catch up, launching the excellent 8K <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-max2-review">GoPro MAX2</a> 360 camera, although there's no inkling that GoPro wants to venture into the drones market with that tech right now.</p><p>DJI is yet to come out with its own 360° quadcopter, and many rumors circulating online indicate the imminent launch of the DJI Avata 360. The Avata lineup consists of the brand's immersive, first-person view (FPV) drones, so it won't surprise me if the Avata 360 is the next to launch. I can imagine other brands, like Potensic and HoverAir, will probably want to jump on the 360° bandwagon too, but they don't currently have action cameras that already features that tech, so it's unlikely.</p><p>I'm looking forward to seeing DJI's 360° drone. It'll probably feature 8K/30fps video (even better if it's 60fps and it upstages the Antigravity A1), and be accompanied by FPV goggles (something even better than the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3</a>) and a motion controller. And a better app! The DJI Fly app is good but the brand's 360° drone will require a proper editing app, such as DJI Mimo.</p><h2 id="prediction-2-even-more-immersive-flying">Prediction #2: Even more immersive flying</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VYstG2tE2RAhXJYR2kLYQM" name="Antigravity_A1_ 5.JPG" alt="An Antigravity A1 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/VYstG2tE2RAhXJYR2kLYQM.jpg" mos="" align="middle" fullscreen="" width="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 Antigravity A1 is a fantastic 360° drone, but could we see improvements made to it in 2026? Surely Antigravity will want to release another drone as soon as possible to stay ahead of the competition (DJI, mostly), and in my <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-exclusive-developer-interview">exclusive interview with Antigravity's Product Lead</a>, Buu said, "The A1 is just the beginning."</p><p>So, what could be next for immersive flying? I can't imagine a successor to the A1 will come out so quickly, but maybe there will be new accessories for us to play with. What I would love to see — from DJI, Antigravity or anyone, really — is haptic feedback in motion controllers.</p><p>Haptic feedback is found in Sony's PS5 DualSense controllers, as an example, and it's one of my favorite things about my gamepad. FPV flying is already well-refined but I believe it could be made even better. Pop some haptic feedback and vibrations into controllers and let users feel the proximity of walls or the force of the wind in their hands.</p><h2 id="prediction-3-waterproof-drones-make-a-splash">Prediction #3: Waterproof drones make a splash</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2188px;"><p class="vanilla-image-block" style="padding-top:56.22%;"><img id="MGTn5sJfZ9eUPESbMLKgfX" name="Hoverair-aqua" alt="An orange HoverAir Aqua drone" src="https://cdn.mos.cms.futurecdn.net/MGTn5sJfZ9eUPESbMLKgfX.jpg" mos="" align="middle" fullscreen="" width="2188" height="1230" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: ZeroZero Robotics)</span></figcaption></figure><p>While I haven't personally tested it yet, I've been intrigued by the HoverAir Aqua, a 100% waterproof self-flying drone that can land on and takeoff from the surface of the water. According to the <a href="https://www.indiegogo.com/en/projects/hoverair/hoverair-aqua-first-waterproof-self-flying-camera/" target="_blank" rel="nofollow">campaign page</a>, the Aqua can withstand winds up to 34mph, making it the ideal quadcopter for water sports.</p><p>At the time of writing, the Aqua is one of a kind, and faces no competition from any of the brand's rivals. Most consumer drones aren't waterproof and I wouldn't advise flying any in heavy downpour, and snowy or stormy conditions. I think we could we see more waterproof drones from the likes of DJI and Potensic.</p><p>Any waterproof drone will need to sport a hydrophobic, anti-corrosive design, something the Aqua already does. But it shouldn't be too hard as this technology already exists out in the world.</p><h2 id="prediction-4-budget-king-goes-pro">Prediction #4: Budget king goes pro</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3gYeUSJLu7pKmUd5axhetJ" name="Potensic_Atom2_Drone_ 14.JPG" alt="A Potensic Atom 2 drone" src="https://cdn.mos.cms.futurecdn.net/3gYeUSJLu7pKmUd5axhetJ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This year, we finally saw a proper contender that went toe-to-toe with DJI's mini drones, and that's the <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review">Potensic Atom 2</a>. Worthy of being considered the <a href="https://www.tomsguide.com/cameras-photography/drones/ive-been-testing-this-drone-for-a-month-and-its-the-ultimate-dji-mini-4k-alternative">best DJI Mini 4K alternative</a>, the Atom 2 is a beast, thanks to its ability to capture 48MP images, record stable 4K/30fps footage with its three-axis mechanical gimbal and 1/2-inch CMOS sensor.</p><p>But Potensic's lineup feels like it's still in the infancy stage, as the brand makes only budget, sub-250g quadcopters. I predict the brand will want to enter the big leagues and come up with a drone that challenges the likes of the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review">DJI Air 3S</a>. Right now, there aren't very many alternatives to DJI's prosumer lineup — and there will need to be, as the <a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">FCC banned the import and sale of any new foreign-made drones and components</a> as of December 23 2025.</p><p>I predict either Potensic or another non-DJI brand will launch a big drone (or at least announce it in 2026) that will be a force to reckon with.</p><h2 id="looking-ahead">Looking ahead...</h2><p>Everything in this article is, of course, speculation and should be taken with a pinch of salt, but hey, it's fun to ponder over what the future holds, isn't it? Rest assured that as and when any drone announcements happen in 2026, I'll be covering them all. Until then, I wish you all happy holidays and a restful break, and I'll see you soon.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OqyqdO"></div>                            </div>                            <script src="https://kwizly.com/embed/OqyqdO.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/us/best-drones,review-2412.html">Best drones in 2025</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/just-got-a-drone-for-christmas-2025-take-to-the-skies-with-these-tips-from-an-expert">Just got a drone for Christmas 2025? Take to the skies with these tips from an expert</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/best-footage-i-ve-taken-on-drones-reviewed-2025">I reviewed every drone that came out in 2025: these are the best photos and videos I’ve taken</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I reviewed every drone that came out in 2025: these are the best photos and videos I’ve taken ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/best-footage-i-ve-taken-on-drones-reviewed-2025</link>
                                                                            <description>
                            <![CDATA[ From beginner-friendly drones to prosumer quadcopters, I tested every drone from DJI, HoverAir, Potensic and Antigravity this year. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xXxEQ5efDhugai8MFZ9yTW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LtB87hBbbiaXkWXcqU6RgV-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 29 Dec 2025 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/LtB87hBbbiaXkWXcqU6RgV-1280-80.jpg">
                                                            <media:credit><![CDATA[Nikita Achanta / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of images taken on various drones]]></media:description>                                                            <media:text><![CDATA[A selection of images taken on various drones]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of images taken on various drones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LtB87hBbbiaXkWXcqU6RgV-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Happy holidays, dear reader! I hope you've been enjoying time off from work, recharging your batteries, and are happy with however you've chosen to spend the holidays. Downtime from work means you've got time to take your camera or drone out for a spin and be at one with nature.</p><p>If you know me or are familiar with my work as a senior reviews writer at Tom's Guide, you'll know that not only do I adore anything related to photography, but I review the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> and <a href="https://www.tomsguide.com/us/best-cameras,review-2196.html">best cameras</a> day in and day out. Few things make me happier than being able to see the world from a bird's eye view.</p><p>While 2024 was a great year for drones, 2025 has arguably been better — trust me, I'd know, given that I've reviewed <em>every </em>drone that came out this year. DJI has continued to set new standards with every release, while a new 360-degree drone from Insta360's Antigravity joined the fight. I've taken many videos and photos on every 2025 quadcopter, so <a href="https://www.tomsguide.com/cameras-photography/ive-tested-25-cameras-and-drones-this-year-and-these-are-the-best-photos-ive-taken">as I did last year</a>, I've rounded up my favorite shots. Welcome to my Drone Photography Wrapped 2025!</p><p>On December 23, 2025, the <a href="https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you">FCC banned the import and sale of any new foreign-made drones and components</a>, noting that any entity "posing an unacceptable risk to the national security of the United States or the security and safety of United States persons" would be added to a "Covered List" going forward. Consumers anywhere else, outside of the U.S., will <em>still</em> be able to buy new drones from foreign manufacturers.</p><h3 class="article-body__section" id="section-every-drone-i-ve-tested-this-year"><span>Every drone I've tested this year</span></h3><ul><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review"><em><strong>DJI Flip</strong></em></a><em><strong> : </strong></em><a href="https://www.amazon.com/DJI-Screen-Remote-controller-Propeller/dp/B0FPWQLNXR/" target="_blank" rel="nofollow">$499</a> / <a href="https://www.amazon.co.uk/DJI-Stabilization-Transmission-Takeoff-Intelligent/dp/B0DJ1H6KCP/" target="_blank" rel="nofollow">£369</a> @ Amazon</li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review"><em><strong>DJI Mavic 4 Pro</strong></em></a><em><strong> : </strong></em><a href="https://www.amazon.com/DJI-Tri-Camera-Hasselblad-Professionals-Transmission/dp/B0DS2HDF1M/" target="_blank" rel="nofollow">$2,699</a> / <a href="https://www.amazon.co.uk/dp/B0DS2HDF1M/" target="_blank" rel="nofollow">£1,879</a> @ Amazon</li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review"><em><strong>DJI Mini 5 Pro</strong></em></a><em><strong> : </strong></em><a href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">$759</a> / <a href="https://www.amazon.co.uk/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">£689</a> @ Amazon</li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review"><em><strong>DJI Neo 2</strong></em></a><em><strong> : </strong></em><a href="https://www.adorama.com/djineo2.html" target="_blank" rel="nofollow">$319</a> @ Adorama / <a href="https://www.amazon.co.uk/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">£209</a> @ Amazon</li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review"><em><strong>DJI Goggles N3</strong></em></a><em><strong> : </strong></em><a href="https://www.adorama.com/djicprc03301.html" target="_blank" rel="nofollow">$229</a> @ Adorama / <a href="https://www.amazon.co.uk/DJI-Ultra-Wide-Immersive-Experience-Streaming/dp/B0DHLJ3576/" target="_blank" rel="nofollow">£229</a> @ Amazon</li><li><a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review"><em><strong>Antigravity A1</strong></em></a><em><strong> : </strong></em><a href="https://www.adorama.com/agde00101.html" target="_blank" rel="nofollow">$1,599</a> @ Adorama / <a href="https://www.cliftoncameras.co.uk/antigravity-a1-8k-360-drone-standard-bundle/" target="_blank" rel="nofollow">£1,219</a><em><strong> </strong></em>@ Amazon<em><strong> </strong></em></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/hoverair-x1-pro-promax-review"><em><strong>HoverAir X1 Pro</strong></em></a><em><strong> : </strong></em><a href="https://www.amazon.com/HOVERAir-Automatic-OmniTerrain-Collision-Detection/dp/B0DGTHCKKS/" target="_blank" rel="nofollow">$499</a> / <a href="https://www.amazon.co.uk/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DP6MVPSR/" target="_blank" rel="nofollow">£459</a> @ Amazon</li><li><a href="https://www.tomsguide.com/cameras-photography/drones/hoverair-x1-pro-promax-review"><em><strong>HoverAir X1 ProMax</strong></em></a><em><strong> : </strong></em><a href="https://www.amazon.com/HOVERAir-Automatic-OmniTerrain-Collision-Detection/dp/B0DGTHLVR3/" target="_blank" rel="nofollow">$699</a> / <a href="https://www.amazon.co.uk/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DRFJHQYP/" target="_blank" rel="nofollow">£639</a> @ Amazon</li><li><a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review"><em><strong>Potensic Atom 2</strong></em></a><em><strong> : </strong></em><a href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHHSX7H/" target="_blank" rel="nofollow">$329</a> / <a href="https://www.amazon.co.uk/dp/B0DK96GZK4/" target="_blank" rel="nofollow">£299</a> @ Amazon</li></ul><h2 class="article-body__section" id="section-my-best-videos-on-drones"><span>My best videos on drones</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/BJAwH56l5xk" allowfullscreen></iframe></div></div><p>January 2025 was a fantastic month for one reason: DJI came out with the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review">DJI Flip</a>, and as soon as I tested it, I knew it was the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html#section-best-for-beginners">best drone for beginners</a>. I loved its propeller guards which give beginner pilots reassurance when flying in tight spaces, detailed and hi-res 48MP stills, and 4K/60fps video. I also adore that it looks like a droid from Star Wars.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Ww0FITWUldI" allowfullscreen></iframe></div></div><p>2025 also saw DJI set a new gold standard for mini drones with the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>. Massively improving on its predecessor by introducing a large 1-inch sensor for improved low-light performance, better obstacle avoidance, 225° gimbal rotation, and more packed into a compact body, the Mini 5 Pro is a formidable drone, and one I struggled to put down.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/JMjppk1V0Xg" allowfullscreen></iframe></div></div><p>But of course, beginner, amateur and casual pilots weren't the only ones who had all the fun this year. For prosumers and professional content creators, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> was (and still is) <em>the </em>quadcopter to get. Although pricey, the Mavic 4 Pro is worth every cent if you want best-in-class 100MP Hasselblad-powered stills, 6K/30fps video, and a rotating gimbal.</p><p>I've captured some of my best footage on the Mavic 4 Pro — primarily because I took it to the beach. But also because thanks to its peerless image stabilization and three-axis mechanical gimbal, I could capture shake-free footage even in extremely windy conditions.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/-F-7a9Rym3g" allowfullscreen></iframe></div></div><p>Alongside being a great year for aerial photographers and videographers, 2025 was lovely for those who just wanted to have fun, either solo or with others. It's the year I started enjoying DJI's QuickShot Intelligent Flight modes even more. My partner's family and I took the Mavic 4 Pro to the beach and had a lot of fun with the QuickShot modes, and it helped us create memories we will remember forever.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/yn_h9z0llrE" allowfullscreen></iframe></div></div><p>I've always been a fan of FPV (first-person view) headsets, and I never skip a video of a pilot flying their drone through one of these — so I'm very lucky that I got to try one out myself this year. I reviewed the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3</a> paired with the DJI Neo, and it <a href="https://www.tomsguide.com/cameras-photography/drones/i-tested-the-dji-goggles-n3-for-a-month-and-i-dont-want-to-fly-a-drone-without-an-fpv-headset-ever-again">made me realize that I don't want to fly drones with traditional controllers</a> if I can fly them via FPV headsets instead.</p><p>The Goggles N3 and the RC Motion 3 motion controller make flying much more immersive, and give you more control over your drone, enabling you to fly in tight spaces and make tricky maneuvers. It's some of the most fun I've had testing a product — and when you're having fun while working, it doesn't really feel like work, does it?</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/HZwkylT5iIQ" allowfullscreen></iframe></div></div><p>My Drone Photography Wrapped 2025 would be incomplete without me talking about the brand new <a href="https://www.tomsguide.com/cameras-photography/drones/antigravity-a1-review">Antigravity A1</a>, the world's first-ever 360-degree drone. Antigravity is "incubated" by Insta360, so it utilizes the same tech found in the brand's 360-degree cameras, and it's a feat of engineering.</p><p>8K/30fps aerial video that can be reframed to 4K in post-production while maintaining hi-res quality is a game-changed for quadcopters, and it shows that DJI needs to pull up its socks. The possibilities are endless, and pilots can get super creative thanks to the ability to capture every single angle. The A1 is a triumph, and I can't wait to see what Antigravity (and DJI) does in 2026.</p><h2 class="article-body__section" id="section-my-best-photos-on-drones"><span>My best photos on drones</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ZzSVmNwHUWMVjvFuExe6A.jpg" alt="A photo taken with a DJI Mavic 4 Pro consumer drone" /><figcaption>Taken on a DJI Mavic 4 Pro.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/7tRM4opHoVqhruVDsoMCHo.jpg" alt="A photo taken with a DJI Mavic 4 Pro consumer drone" /><figcaption>Taken on a DJI Mavic 4 Pro.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9NPa4vPVdZaR3SMmkvsrCX.jpg" alt="A photo of a park taken on a DJI Flip drone" /><figcaption>Taken on a DJI Flip.<small role="credit">Nikita Achanta / Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/yc6ckGwoffcxWgGghsshJX.jpg" alt="A photo of a city taken on a DJI Flip drone" /><figcaption>Taken on a DJI Flip.<small role="credit">Nikita Achanta / Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/o8evz3TKChgFSNfy79xt95.jpg" alt="A photo taken on a DJI Mini 5 Pro drone" /><figcaption>Taken on a DJI Mini 5 Pro.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>Drones aren't just about videography, of course, and I captured some fantastic stills on this year's quadcopters, as you can see in the gallery above. I especially enjoyed using the DJI Mavic 4 Pro for photography because, well, it's basically a Hasselblad with wings. The drone packs a whopping 100MP camera, making it <em>the </em><a href="https://www.tomsguide.com/us/best-drones,review-2412.html#section-best-camera-drone">best camera drone</a> out there (and I think that'll be hard to beat).</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/R6yAZa8SKMfTqh5i4sqAhN.jpg" alt="A dark grey DJI Mavic 4 Pro drone" /><figcaption>DJI Mavic 4 Pro.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/h4dUyU3wHed3pb3XZwpEFX.jpg" alt="A gray DJI Flip drone with propeller guards" /><figcaption>DJI Flip.<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/4Uiqt5CH6yKxG8eVKWTDc8.jpg" alt="A dark grey DJI Mini 5 Pro drone" /><figcaption>DJI Mini 5 Pro.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Avooo5QZgXBNdVf5KpcPQi.jpg" alt="A dark gray DJI Neo 2 camera drone" /><figcaption>DJI Neo 2.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hbcNMgpoEoYhPTiu4vFFPM.jpg" alt="An Antigravity A1 360-degree drone" /><figcaption>Antigravity A1.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>As someone who reviews drones for a living, I can confidently say that 2025 has been the strongest and most exciting year for quadcopters yet — and I have high hopes for 2026. Perhaps we'll see more 360-degree drones to give the Antigravity A1 competition, perhaps there will be more FPV flying ones. Regardless of what happens, rest assured that I will be covering them as and when they come out.</p><p>And there you have it, folks. Thanks for tuning into my Drone Photography Wrapped 2025. I wish you all restful holidays, and I will see you next year.</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/us/best-drones,review-2412.html">Best drones in 2025</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/i-test-drones-for-a-living-heres-what-i-think-of-reddits-top-recommendations-for-beginners">I test drones for a living — here’s what I think of Reddit’s top recommendations for beginners</a></li><li><a href="http://www.tomsguide.com/cameras-photography/best-photos-i-ve-taken-on-cameras-reviewed-2025">I’ve reviewed nearly 30 cameras this year: these are the best photos I’ve taken on instant, film and mirrorless</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Just got a drone for Christmas 2025? Take to the skies with these tips from an expert ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/just-got-a-drone-for-christmas-2025-take-to-the-skies-with-these-tips-from-an-expert</link>
                                                                            <description>
                            <![CDATA[ From registering your drone and conducting a pre-flight check to checking the weather, here's everything you need to do before you fly for the first time. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zLi4K2gim7xQQsNP3kdF4C</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/R6yAZa8SKMfTqh5i4sqAhN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 26 Dec 2025 12:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/R6yAZa8SKMfTqh5i4sqAhN-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A dark grey DJI Mavic 4 Pro drone]]></media:description>                                                            <media:text><![CDATA[A dark grey DJI Mavic 4 Pro drone]]></media:text>
                                <media:title type="plain"><![CDATA[A dark grey DJI Mavic 4 Pro drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/R6yAZa8SKMfTqh5i4sqAhN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Happy holidays, everyone! I hope you've all been having a restful break from work, and are enjoying lots of chocolate and sweet treats. I'm sure many of you have either bought or have been gifted some fantastic presents and tech that you can't wait to try out. If you just got a drone for Christmas, congratulations and welcome to the club.</p><p>Aerial photography is extremely exciting and it has been a great year for drones, but it can be a little overwhelming if this is your first time owning a quadcopter. If that is the case, you've come to the right place. I oversee the drones coverage here at Tom's Guide, and I personally test and review the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> nearly every month.</p><p>I'm a licensed drone pilot, based in the U.K., and I'm here to tell you about the things you should do before taking to the skies for the first time — from registering your quadcopter and charging it up, to conducting pre-flight checks, amongst other things. Once you've taken your first flight, let me know in the comments what you thought of it!</p><h2 id="1-register-your-drone">1. Register your drone</h2><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="9xndjuvG25QTwc9pZcNgC7" name="DJI-Neo-app.jpg" alt="A compilation of screenshots showing the DJI Fly app open on a Google Pixel 7 Pro" src="https://cdn.mos.cms.futurecdn.net/9xndjuvG25QTwc9pZcNgC7.jpg" mos="" align="middle" fullscreen="1" width="1510" height="850" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/9xndjuvG25QTwc9pZcNgC7.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DJI)</span></figcaption></figure><p>One of the first things you need to do when you unbox your shiny new drone is <strong>register it with your local governing body</strong>. In the U.K., where I'm based, you need to register your quadcopter with the <a href="https://www.caa.co.uk/" target="_blank" rel="nofollow">C.A.A.</a>, and if you're in the U.S., head over to the <a href="https://www.faa.gov/" target="_blank" rel="nofollow">F.A.A.</a> website for registration.</p><p>Bear in mind, registering your drone depends on the type you have. Some drones, such as the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review">DJI Flip</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a>, weigh less than 8.81oz / 250g. Because of their light weight, you don't necessarily need to register them, as the rules are more relaxed. However, if your drone weighs more than that, such as the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> or the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> (when using Intelligent Flight batteries), you <em>definitely </em>need to register it.</p><h2 id="2-check-the-weather">2. Check the weather</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:8064px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bLrRbqtuH5i7SpWBUwK9uW" name="DJI-Flip-sample-10" alt="A photo of a river taken on a DJI Flip drone" src="https://cdn.mos.cms.futurecdn.net/bLrRbqtuH5i7SpWBUwK9uW.jpg" mos="" align="middle" fullscreen="" width="8064" height="4536" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Future)</span></figcaption></figure><p>Once you've registered your drone, it's time to go flying! Exciting, but hold your horses. What's the weather looking like outside? It's vital that you <strong>check the weather before heading out</strong>. You can use the weather app on your smartphone or use a website, like the <a href="https://www.metoffice.gov.uk/" target="_blank" rel="nofollow">Met Office in the U.K.</a> or the <a href="https://www.weather.gov/" target="_blank" rel="nofollow">National Weather Service in the U.S.</a> to check not just the weather, but also how windy it is.</p><p>Different drones have different wind resistance levels, so it's crucial that you not fly if it's stormy or extremely windy outside. Most consumer drones aren't weather-sealed either, so be mindful not to fly your quadcopter when it's raining. Sunny and cloudless conditions are ideal, of course.</p><h2 id="3-charge-your-batteries">3. Charge your batteries</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qq3zy9nqUwe9XvKpUcNmPi" name="DJI_Neo_2_ 7.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/Qq3zy9nqUwe9XvKpUcNmPi.jpg" mos="" align="middle" fullscreen="" width="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>Once the weather is looking ideal, <strong>check and charge your drone batteries</strong>. Most consumer drones can fly for under 40 minutes on a single charge — some even less. It is, then, very important that you carry spare batteries, especially if you're heading far from home. Trust me, there are few things worse than when you drive somewhere to fly, take your drone out, and realize you have only 10% battery remaining.</p><h2 id="4-update-your-drone-s-firmware">4. Update your drone's firmware</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="epYiNpHjQs4KmWZhHGSHd8" name="dji_mini_5_pro 8.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/epYiNpHjQs4KmWZhHGSHd8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When you unbox your drone, bear in mind that it may not have the latest firmware installed. More often than not, it'll be an out-of-date firmware, as the drones are boxed up weeks or months in advance of you receiving them. Use your drone's companion app to <strong>update the firmware of the drone as well as the controller</strong>.</p><p>Updating the firmware ensures that the drone and controller function as intended, and that their safety features are up to mark and functioning as well as they can be.</p><h2 id="5-conduct-a-pre-flight-check">5. Conduct a pre-flight check</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BTLThyBJAwzrxKUMeaw8gN" name="DJI_mavic_4_Pro_ 10.JPG" alt="A dark grey DJI Mavic 4 Pro drone" src="https://cdn.mos.cms.futurecdn.net/BTLThyBJAwzrxKUMeaw8gN.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now that you've done the first steps and are out in the field, it's time to <strong>conduct a pre-flight check</strong>. Even though I've been flying drones for years, this is something I always do, and it helps ensure that your drone doesn't malfunction mid-flight, preventing crashes.</p><p>What does this involve exactly? It's simple, so don't worry. You must <strong>check all of the drone's parts</strong>. This means you should <strong>check that the gimbal can move freely</strong>, and <strong>ensure the propellers aren't damaged</strong>. Propellers can be delicate and can get damaged if you drone bumps into something. Most drones come with spare replacement propellers, and it's fairly easy to replace them as they utilize a lock and twist mechanism. There will be detailed directions in the drone's manual.</p><p>Sometimes, you'll get a notification on the drone's companion app to <strong>recalibrate the compass and gimbal</strong>, so don't ignore it. This ensures you drone is able to fly back home accurately. Last but not least, <strong>check the drone has enough storage</strong>, and carry a spare microSD card if your quadcopter supports it.</p><h2 id="6-keep-an-eye-on-your-drone">6. Keep an eye on your drone</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hbcNMgpoEoYhPTiu4vFFPM" name="Antigravity_A1_ 1.JPG" alt="An Antigravity A1 360-degree drone" src="https://cdn.mos.cms.futurecdn.net/hbcNMgpoEoYhPTiu4vFFPM.jpg" mos="" align="middle" fullscreen="" width="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>Have you taken off yet? Nice, congratulations on your first takeoff! Now, it's important to <strong>keep your drone in visual line of sight (VLOS)</strong>. Regardless of where you're flying — whether it's an open field or a cityscape — you should be able to see your drone at all times.</p><p>This is a legal requirement in most countries, and it also helps you gauge obstacles, people, vehicles, etc. The last bit is especially important if your drone doesn't feature obstacle avoidance, as a few don't.</p><h2 id="7-utilize-your-drone-s-safety-features">7. Utilize your drone's safety features</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1080px;"><p class="vanilla-image-block" style="padding-top:56.30%;"><img id="8uTwQqfTZYs965efEktRc8" name="dji_mini_5_pro 16.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/v2/t:145,l:718,cw:1080,ch:608,q:80/8uTwQqfTZYs965efEktRc8.jpg" mos="" align="middle" fullscreen="" width="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><strong>Your drone is packed with safety features</strong>, especially if you got a drone that's more on the expensive side of things. Some quadcopters, like the DJI Mini 5 Pro and the DJI Neo 2, feature omnidirectional obstacle avoidance which means they can either bypass or brake in front of obstacles.</p><p>You should <strong>always utilize these safety features</strong>, especially if you're in a sticky situation or are unsure of what to do. For instance, 99% of drones feature something called "return-to-home." This means that your drone can automatically return to its last-known takeoff position when you hit the button, or battery is running low. My motto? When in doubt, RTH — and so should you.</p><h2 id="8-keep-an-eye-on-your-controller">8. Keep an eye on your controller</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="unFLYKZ6QKnGRMM5qE9hFX" name="DJI_Flip_Drone 10.JPG" alt="A gray DJI Flip drone with propeller guards" src="https://cdn.mos.cms.futurecdn.net/unFLYKZ6QKnGRMM5qE9hFX.jpg" mos="" align="middle" fullscreen="" width="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>Your drone's controller, or your smartphone, shows lots of vital information and <strong>you should keep an eye on it</strong>. This information includes but is not limited to wind speed, number of connected satellites, signal strength, height and distance, drone battery level, and more. Depending on the manufacturer, <strong>the controller will also display flight warnings</strong>.</p><h2 id="9-grab-some-accessories">9. Grab some accessories</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NMmWhT39D2JcubNyvAwPJi" name="DJI_Goggles_N3_03.JPG" alt="A person wearing the DJI Goggles N3 FPV headset in a dary gray colorway and holding a DJI RC Motion 3 controller" src="https://cdn.mos.cms.futurecdn.net/NMmWhT39D2JcubNyvAwPJi.jpg" mos="" align="middle" fullscreen="" width="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>Trust me when I say that once you've got a taste for drone flying, you want to do everything you can to enhance that experience. Luckily, there are plenty of accessories available out there, and it's definitely worth investing in them. Whether that's a landing/launch pad or a first-person view (FPV) headset for immersive flying, <strong>get some accessories for yourself</strong>.</p><p>My top recommendation, if you own the DJI Avata 2, DJI Neo 2 or the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review#section-dji-neo-review-image-video-quality">DJI Neo</a>, is to buy the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3</a> and the DJI RC Motion 3 controller. These FPV gadgets make flying more intuitive and immersive, and <a href="https://www.tomsguide.com/cameras-photography/drones/i-tested-the-dji-goggles-n3-for-a-month-and-i-dont-want-to-fly-a-drone-without-an-fpv-headset-ever-again">I enjoyed it so much that it made me not want to use traditional controllers again</a>!</p><h2 id="10-stay-away-from-wildlife">10. Stay away from wildlife</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:8064px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bax9oX2VvxrWKeNrwpJkua" name="DJI-Air-3S-sample-zoom-6x.JPG" alt="A shot of cows taken with a DJI Air 3S drone" src="https://cdn.mos.cms.futurecdn.net/bax9oX2VvxrWKeNrwpJkua.jpg" mos="" align="middle" fullscreen="" width="8064" height="4536" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Future)</span></figcaption></figure><p>Another important thing to remember while flying a drone: <strong>do not disturb wildlife</strong>. Animals are sensitive to loud sounds, and we shouldn't be disturbing them in their habitat. You can fly your drone at a distance, of course, where you're sure the loud noise isn't rattling them.</p><p>This applies to birds too. Birds may want to protect their nests and might get territorial, so they may see your drone as a threat. It is crucial that you withdraw your drone and promptly return to home in case you're in a pickle. Again, remember: when in doubt, RTH.</p><h2 id="11-have-fun">11. Have fun!</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/-F-7a9Rym3g" allowfullscreen></iframe></div></div><p>Last but not least, <strong>remember to have fun</strong>! Aerial photography is extremely exciting and <a href="https://www.tomsguide.com/cameras-photography/drones/the-dji-air-3s-is-the-one-drone-id-buy-with-my-own-money-heres-why-it-brings-me-unbridled-joy">it can help you get creative</a>. Few things compare to the joy you feel when you see the world from a bird's eye view. Experiment with different photography and videography styles, have fun in a group of people with QuickShot Intelligent Flight modes, just go for it — as long as you're being safe and following the law, of course.</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/us/best-drones,review-2412.html">Best drones in 2025</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/i-tested-the-dji-neo-2-and-its-so-good-that-i-dont-want-to-go-anywhere-without-it">I tested the DJI Neo 2 and it’s so good that I don’t want to go anywhere without it</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/i-test-drones-for-a-living-heres-what-i-think-of-reddits-top-recommendations-for-beginners">I test drones for a living — here’s what I think of Reddit’s top recommendations for beginners</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ US bans foreign-made drones including those by DJI — here’s what it means for you ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/us-bans-foreign-made-drones-including-those-by-dji-heres-what-this-means-for-you</link>
                                                                            <description>
                            <![CDATA[ As of December 23 2025, the FCC has banned the import of all foreign-made drones and components, citing a security risk. Here's how that impacts you. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">zgS3ywDPnZSqwS8cRTweGW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/g2Y9nfW94voTMETLtgWs6M-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 23 Dec 2025 10:42:54 +0000</pubDate>                                                                                                                                <updated>Tue, 23 Dec 2025 14:05:32 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/g2Y9nfW94voTMETLtgWs6M-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Air 2S drone review]]></media:description>                                                            <media:text><![CDATA[DJI Air 2S drone review]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Air 2S drone review]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/g2Y9nfW94voTMETLtgWs6M-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>On December 23 2025, the Federal Communications Commission made it impossible for U.S. customers to buy new foreign-made drones — specifically, those made by Chinese manufacturers, including DJI, the biggest drone maker in the world right now. </p><p>This ordeal has been going on for some time now, and this final blow comes shortly after the <a href="https://www.tomsguide.com/cameras-photography/drones/fcc-just-voted-to-retroactively-ban-dji-drones-heres-what-you-need-to-know">FCC unanimously voted to give itself the ability to retroactively ban devices and radio components</a> in November.</p><p>The <a href="https://docs.fcc.gov/public/attachments/DA-25-1086A1.pdf" target="_blank" rel="nofollow">Public Notice released by the FCC this week</a> states that the import and sale of all new Chinese-made drone models will be blocked, and manufacturers such as DJI will be added to a "Covered List" of entities pegged as "posing an unacceptable risk to the national security of the United States or the security and safety of United States persons."</p><p>Although DJI has released many new drones this year, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a> haven't been available to buy directly through DJI since launch — and that's due to the looming ban, which has now become a reality. </p><p>The company's forthcoming drones will likely continue to be sold in other parts of the world for now but it's surely a blow to U.S. consumers.</p><h2 id="what-does-this-mean-for-existing-drone-owners">What does this mean for existing drone owners?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XCzhoVTzFikC6oASuEvNBQ" name="DJIAir3S_02.JPG" alt="A dark gray DJI Air 3S drone" src="https://cdn.mos.cms.futurecdn.net/XCzhoVTzFikC6oASuEvNBQ.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div><blockquote><p>If you already own a DJI or other foreign-made drone, you don't need to worry about anything right now.</p></blockquote></div><p>If you already own a DJI or other foreign-made drone, you don't need to worry about anything right now. You can still fly it, legally. The FCC has emphasized that the ruling does not affect quadcopters that have already been purchased, and it doesn't impact device models that have previously received FCC authorization either.</p><p>Existing drone owners can continue to fly their quadcopters while retailers can continue to sell models approved earlier this year or previously through the FCC’s equipment authorization process. This, technically, would mean that <a href="https://www.tomsguide.com/cameras-photography/the-dji-osmo-pocket-4-has-been-spotted-in-the-wild-and-it-could-be-coming-before-the-new-year">the rumored DJI Osmo Pocket 4 will be released to the American audiences, as it has been formally registered with the FCC</a> — but we don't have any official confirmation or release date yet.</p><p>DJI should continue to provide DJI Care Refresh and repair services for existing drones and devices that have already been approved by the FCC, too. So, according to the FCC ruling on December 23, the new restrictions would apply <em>only </em>to new device models going forward.</p><h2 id="will-this-impact-emergency-services">Will this impact emergency services?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MLJMWPvmVYanDaz4yEiyzD" name="dji_mini_5_pro 16.JPG" alt="A DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/MLJMWPvmVYanDaz4yEiyzD.jpg" mos="" align="middle" fullscreen="" width="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>Most of the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> are made by the likes of DJI, HoverAir, Potensic and Antigravity. These are all Chinese brands, and the FCC's ban will impact them, making existing stock either scarcely available and new stock not available at all. </p><p>This will, in time, impact emergency services and first responders who utilize drones to get a bird's eye view on the situation they're tackling.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1414px;"><p class="vanilla-image-block" style="padding-top:77.79%;"><img id="uDkkmnDABj5TrGFBvgVuRo" name="DJI-drone-ban" alt="An infographic showing the impact of the drone ban in the U.S." src="https://cdn.mos.cms.futurecdn.net/uDkkmnDABj5TrGFBvgVuRo.png" mos="" align="middle" fullscreen="1" width="1414" height="1100" attribution="" endorsement="" class="inline expandable"><a href='https://cdn.mos.cms.futurecdn.net/uDkkmnDABj5TrGFBvgVuRo.png' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DJI)</span></figcaption></figure><p>The infographic above, created by DJI, shows the impact of the drone ban on American first responders. The lack of American-made drones makes the situation worse, as there are virtually no alternatives. There are some jarring numbers in the infographic too, such as:</p><ul><li>"Austin Police Department estimated that replacing its drone fleet — comprised entirely of DJI products — would cost <strong>$120,000</strong>"</li><li>"The cost to replace the grounded drones in Florida is estimated at <strong>$200m</strong>"</li><li>"'Compliant' alternatives are harder to access and can take up to <strong>6 months for delivery</strong>."</li></ul><p>The drone ban, then, will deprive countless individuals and professionals of essential equipment that has become fundamental to not only workplace safety, but operational efficiency too, and it will cost a lot of money (and time) to replace foreign-made technology.</p><h2 id="dji-s-statement-on-the-drone-ban">DJI's statement on the drone ban</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="h4dUyU3wHed3pb3XZwpEFX" name="DJI_Flip_Drone 7.JPG" alt="A gray DJI Flip drone with propeller guards" src="https://cdn.mos.cms.futurecdn.net/h4dUyU3wHed3pb3XZwpEFX.jpg" mos="" align="middle" fullscreen="" width="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>Today, a DJI spokesperson released the following statement:</p><p><em>"DJI is disappointed by the Federal Communications Commission’s action today to add foreign‑made drones to the Covered List. While DJI was not singled out, no information has been released regarding what information was used by the Executive Branch in reaching its determination.</em></p><p><em>"As the industry leader, DJI has advocated for an open, competitive market that benefits all US consumers and commercial users, and will continue to do so. DJI products are among the safest and most secure on the market, supported by years of reviews conducted by U.S. government agencies and independent third parties. Concerns about DJI’s data security have not been grounded in evidence and instead reflect protectionism, contrary to the principles of an open market.</em></p><p><em>"Today’s development will not affect customers who already own DJI products. These existing products can continue to be purchased and operated as usual. The FCC’s fact sheet also indicates that new products may, in the future, be cleared for launch based on determinations made by the Department of Defense and the Department of Homeland Security.</em></p><p><em>"DJI remains committed to the U.S. market. We are deeply grateful to users across the country who spoke up to share how DJI technology supports their work and their communities. We will keep our community informed as more information becomes available."</em></p><h2 id="what-happens-going-forward">What happens going forward?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Avooo5QZgXBNdVf5KpcPQi" name="DJI_Neo_2_ 10.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/Avooo5QZgXBNdVf5KpcPQi.jpg" mos="" align="middle" fullscreen="" width="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 FCC says that exceptions may be granted if the Department of Defense or the Department of Homeland Security deems a specific component or drone does not pose a security risk — but how that will be determined remains to be seen as the FCC has not confirmed the implementation and extent of it.</p><p>December 23 marks a major milestone in the United States' history, and the drone ban is sure to impact hundreds of thousands of consumers and professionals. While existing drones are allowed to fly freely, we do not know how long that will be allowed for, either.</p><p>Do you own a drone? Were you planning to buy one? Have your say on what this means for you in the comments box below.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/cameras-photography/drones/fcc-just-voted-to-retroactively-ban-dji-drones-heres-what-you-need-to-know">DJI drone ban — what you need to know</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2025</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/i-test-drones-for-a-living-heres-what-i-think-of-reddits-top-recommendations-for-beginners">I test drones for a living — here’s what I think of Reddit’s top recommendations for beginners</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the DJI Neo 2 and it’s so good that all I can think about is flying it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/i-tested-the-dji-neo-2-and-its-so-good-that-i-dont-want-to-go-anywhere-without-it</link>
                                                                            <description>
                            <![CDATA[ The new DJI Neo 2 is better than its predecessor in every single way — it's the perfect and best budget drone on the market right now. Here's why. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">wBY3JZ2mMHSG3erG4DgVui</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/vAyQ2nY3DPdH7hfbyQ6FBn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 13 Dec 2025 10:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 17 Dec 2025 09:56:15 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/vAyQ2nY3DPdH7hfbyQ6FBn-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Neo 2 drone]]></media:description>                                                            <media:text><![CDATA[A DJI Neo 2 drone]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Neo 2 drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/vAyQ2nY3DPdH7hfbyQ6FBn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The king of the skies, DJI, has had a massive year packed with action camera, 360-camera and drone launches. I had an inkling it was going to be a good year for drones when the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review">DJI Flip</a> came out in January, and the Chinese manufacturer hopes to close the year big with the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a>, the successor to the one-year-old <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review">Neo</a>. </p><p>The DJI Neo 2 could be the brand's last big launch <a href="https://www.tomsguide.com/cameras-photography/drones/fcc-just-voted-to-retroactively-ban-dji-drones-heres-what-you-need-to-know">before its drones are (potentially) banned in the U.S.</a> And it's going out with a bang.</p><p>I've spent a couple weeks testing the Neo 2, and while I was anticipating minor improvements, I didn't expect DJI to go above and beyond to deliver the quintessential flying experience for beginners and enthusiasts. The Neo 2 feels like the grown-up version of its predecessor, packed with features you don't usually find in budget drones.</p><div class="product"><a data-dimension112="036fe00e-a91c-4ec1-923a-0df2f02404b6" data-action="Deal Block" data-label="The DJI Neo 2 is the best budget drone on the market right now, upstaging its predecessor in every way and doing so at (still) a low price. Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades." data-dimension48="The DJI Neo 2 is the best budget drone on the market right now, upstaging its predecessor in every way and doing so at (still) a low price. Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades." data-dimension25="$259" href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1066px;"><p class="vanilla-image-block" style="padding-top:73.17%;"><img id="qR2QDyEkqYwvExK2rTT6Qe" name="DJI-Neo-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qR2QDyEkqYwvExK2rTT6Qe.png" mos="" align="middle" fullscreen="" width="1066" height="780" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Neo 2 is the best budget drone on the market right now, upstaging its predecessor in every way and doing so at (still) a low price. Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades.<a class="view-deal button" href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow" data-dimension112="036fe00e-a91c-4ec1-923a-0df2f02404b6" data-action="Deal Block" data-label="The DJI Neo 2 is the best budget drone on the market right now, upstaging its predecessor in every way and doing so at (still) a low price. Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades." data-dimension48="The DJI Neo 2 is the best budget drone on the market right now, upstaging its predecessor in every way and doing so at (still) a low price. Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades." data-dimension25="$259">View Deal</a></p></div><p>The Neo 2 rectifies the original Neo's weaknesses while adding even more features: 4K/60fps video, two-axis mechanical gimbal offering better stabilization, Gesture Control, omnidirectional obstacle avoidance, bigger internal storage, (slightly) longer flight time, and lots more. If you're thinking of picking up a selfie drone, I can't think of one better than the Neo 2 —here's why.</p><h2 id="what-makes-the-neo-2-different-from-the-neo">What makes the Neo 2 different from the Neo?</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/e84fy5CC3zR5pmwPbsc99n.jpg" alt="A DJI Neo 2 drone" /><figcaption>The DJI Neo 2 (released in November 2025).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9Ke29PmgdDqe3CiKAgKwv4.jpg" alt="A gray DJI Neo drone with a camera" /><figcaption>The DJI Neo (released in September 2024).<small role="credit">Future</small></figcaption></figure></figure><p>I've given you a snapshot of the upgrades introduced in the DJI Neo 2 so let's talk about that in more detail. Firstly, both the Neo 2 and the Neo feature the same 12MP 1/2-inch CMOS sensor, with the only difference being the aperture (f/2.2 on the Neo 2 versus f/2.8 on the Neo). The Neo 2, however, has received a bump in video quality and it can now shoot 4K/60fps (versus 4K/30fps on the Neo). Also, the Neo 2 has better stabilization thanks to the new and improved two-axis mechanical gimbal.</p><p>The biggest upgrade lies in the Neo 2's omnidirectional obstacle avoidance powered by forward-facing LiDAR and a downward infrared sensing system. This means that it can either brake in front of or bypass obstacles in all directions — something that was missing from the Neo. This is a fantastic safety feature not just for beginners but for advanced pilots, too.</p><p>Internal storage has been increased from 22GB on the Neo to 49GB on the Neo 2 but at the cost of a microSD card slot, so you can't expand the Neo 2's storage. And while the Neo 2 can be flown with a controller or smartphone, it can also be flown hands-free via Gesture Control, making you feel like a Jedi Master! </p><p>Oh, and the Neo 2 comes fitted with a Digital Transceiver (depending on the variant you buy) which lets you connect it with various DJI controllers and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3 FPV </a>headset.</p><h2 id="hands-free-flying-like-never-before">Hands-free flying like never before</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9X6DKGNmeUybSkaL9eq69n" name="DJI_Neo_2_ 8.JPG" alt="A DJI Neo 2 drone" src="https://cdn.mos.cms.futurecdn.net/9X6DKGNmeUybSkaL9eq69n.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now that you know the differences between the DJI Neo 2 and the DJI Neo, let's talk more about what makes the former the best budget drone on the market today. </p><p>One thing I love about the Neo 2 — and something the Neo didn't have — is Gesture Control. You need to enable this via the DJI Fly app on your smartphone, and once that's done, you can use your hands to <em>control </em>the drone. You know, like a Jedi (or a Sith).</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/gQROCX-G1gk" allowfullscreen></iframe></div></div><p>A sensor present next to the drone's gimbal recognizes and detects your hand movements and mimics them. Sounds great in theory, but does it work in the real world? Oh yes it does. </p><p>I had a lot of fun playing around with this feature, and I was able to guide the drone up and down, and move it side to side with ease. You can see how impressive it is (and how goofy I look) in the YouTuve clip above.</p><p>The Neo 2's tiny screen next to the gimbal is a winner, too. This is a new addition so it wasn't present on the Neo, and the only way to tell what mode the Neo was in was through LED lamps and an automated voice prompt. </p><p>The Neo 2's screen, on the other hand, shows you the flight mode and parameters, which can be changed on the fly via buttons on its body, so there really is no need for a controller or smartphone (unless you want to fly in Manual).</p><p>Combine this with Gesture Control and <em>this </em>is what hands-free flying truly looks like.</p><h2 id="avoiding-anything-in-its-way">Avoiding anything in its way</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vxraHgScBMhz6tdDfna9An" name="DJI_Neo_2_ 10.JPG" alt="A DJI Neo 2 drone" src="https://cdn.mos.cms.futurecdn.net/vxraHgScBMhz6tdDfna9An.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I have flown and tested many, many drones, and one of my favorite features — usually reserved for pricier quadcopters — is obstacle avoidance. This can be either forward-facing or omnidirectional, but the latter is obviously better, as it heavily negates the possibility of your drone crashing. It's a must-have feature for beginner and advanced pilots alike.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/cdxdPVGyxNM" allowfullscreen></iframe></div></div><p>Omnidirectional obstacle avoidance is something I've seen on the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review">DJI Air 3S</a>, and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> — much pricier drones that not everyone can necessarily afford. As a result, it's excellent news that the DJI Neo 2 has it, even though the Neo didn't.</p><p>This upgrade alone makes the Neo 2 a far better choice over its predecessor, and every other selfie drone, like the <a href="https://www.tomsguide.com/features/sorry-dji-this-pocketable-folding-drone-is-the-most-fun-ive-had-flying-in-a-long-time">HoverAir X1</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/hoverair-x1-pro-promax-review">HoverAir X1 Pro</a>, which feature obstacle avoidance but are more expensive.</p><h2 id="solo-or-together-this-drone-is-fun-all-the-time">Solo or together, this drone is fun all the time</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vAyQ2nY3DPdH7hfbyQ6FBn" name="DJI_Neo_2_ 2.JPG" alt="A DJI Neo 2 drone" src="https://cdn.mos.cms.futurecdn.net/vAyQ2nY3DPdH7hfbyQ6FBn.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When I'm testing drones for work, I usually fly them on my own — unless it's an FPV headset and I need a spotter, in which instance my partner tags along. (Rather, I drag her out with me.) Flying drones can sometimes get lonely, but the DJI Neo 2 helps combat that feeling of loneliness by simply being a fantastic drone for solo pilots as well as pilots flying with other people.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/n6Gs9cwzSIk" allowfullscreen></iframe></div></div><p>The Neo 2 features DJI's trademark QuickShot Intelligent Flight modes, such as Rocket, Spiral, Dronie, Circle, Follow, and so on. You can take timed selfie shots, too — perfect for group photos — and create MasterShots, where the drone records QuickShot modes and stitches them together, depending on the environment.</p><p>And you know what I love? The fact that Gesture Control feels like magic. My partner tried it, as did two of my friends and all of them were delighted by it, and it made flying the Neo 2 in a group of people a lot more fun! The Neo 2 has made an already formidable drone even better, and honestly? It's a must-have for all pilots.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WnkgrO"></div>                            </div>                            <script src="https://kwizly.com/embed/WnkgrO.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/cameras-photography/drones/dji-neo-2-review">I’ve been testing the DJI Neo 2 and it improves on its predecessor in every way — it’s now my top pick for the best budget drone</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2025</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/i-have-never-seen-a-drone-accessory-as-cool-as-this-one-and-its-the-one-thing-dji-is-missing">I have never seen a drone accessory as cool as this one — and it’s the one thing DJI is missing</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI Neo 2 vs DJI Neo: which selfie drone should you buy? I tested both to find out ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-versus-dji-neo-face-off</link>
                                                                            <description>
                            <![CDATA[ The DJI Neo 2 and the DJI Neo are both spectacular drones, but one is easily better than the other. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mf2ER4RzSsg96jYkiXjFy8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RKLQAYMEoPK4yf87AaFC4T-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 12 Dec 2025 11:21:30 +0000</pubDate>                                                                                                                                <updated>Wed, 17 Dec 2025 09:57:30 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/RKLQAYMEoPK4yf87AaFC4T-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Neo 2 on the left and a DJI Neo on the right]]></media:description>                                                            <media:text><![CDATA[A DJI Neo 2 on the left and a DJI Neo on the right]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Neo 2 on the left and a DJI Neo on the right]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RKLQAYMEoPK4yf87AaFC4T-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>DJI has had a fantastic year so far, and we haven't reached the end yet. It started with the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review">DJI Flip</a> launching in January, and it is (almost) ending with the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2</a>, which landed on shelves in November. The Neo 2 succeeds the Neo, and it has dethroned its predecessor as the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drone</a> for people on a budget — easily, too.</p><p>The first drone I ever reviewed here at Tom's Guide was the Neo, so it holds a special place in my heart... which it now has to share with the Neo 2, simply because the second-gen drone is incredible. I've spent the last couple of weeks putting the Neo 2 through a battery of tests, and comparing it to its predecessor — and there's a clear winner.</p><p>If you're looking for a selfie drone that's budget-friendly and easy to fly, the Neo lineup is a great choice. But which of the two should you buy? You've come to the right place for an answer to that. I'll help you make the right choice in my DJI Neo 2 vs DJI Neo face-off.</p><h2 class="article-body__section" id="section-dji-neo-2-vs-dji-neo-specs-compared"><span>DJI Neo 2 vs DJI Neo: Specs compared</span></h2><div ><table><thead><tr><th class="firstcol " ><p>Specs</p></th><th  ><p>DJI Neo 2</p></th><th  ><p>DJI Neo</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>Starts at <a href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">$319</a> / <a href="https://www.amazon.co.uk/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">£209</a></p></td><td  ><p>Starts at <a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71Fhttps://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow">£169</a></p></td></tr><tr><td class="firstcol " ><p><strong>Flight time</strong></p></td><td  ><p>19 minutes</p></td><td  ><p>18 minutes</p></td></tr><tr><td class="firstcol " ><p><strong>FAA/CAA registration</strong></p></td><td  ><p>Not required</p></td><td  ><p>Not required</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>One</p></td><td  ><p>One</p></td></tr><tr><td class="firstcol " ><p><strong>Image sensor</strong></p></td><td  ><p>12MP 1/2-inch CMOS</p></td><td  ><p>12MP 1/2-inch CMOS</p></td></tr><tr><td class="firstcol " ><p><strong>ISO range</strong></p></td><td  ><p>100-12,800</p></td><td  ><p>100-6400</p></td></tr><tr><td class="firstcol " ><p><strong>Shutter speed</strong></p></td><td  ><p>1/8000-1/10s (Stills) | 1/8,000s-1/30s (Video)</p></td><td  ><p>1/8000-1/10s (Stills) | 1/8000-1/30s (Video)</p></td></tr><tr><td class="firstcol " ><p><strong>Aperture</strong></p></td><td  ><p>f/2.2</p></td><td  ><p>f/2.8</p></td></tr><tr><td class="firstcol " ><p><strong>Focus</strong></p></td><td  ><p>0.7m to ∞</p></td><td  ><p>0.6m to ∞</p></td></tr><tr><td class="firstcol " ><p><strong>Max video resolution</strong></p></td><td  ><p>4K/60fps, 4K/100fps, 2.7K/60fps, FHD/100fps</p></td><td  ><p>4K/30fps</p></td></tr><tr><td class="firstcol " ><p><strong>Stabilization</strong></p></td><td  ><p>Two-axis mechanical gimbal</p></td><td  ><p>One-axis mechanical gimbal</p></td></tr><tr><td class="firstcol " ><p><strong>Indoor use</strong></p></td><td  ><p>Yes</p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Propellers</strong></p></td><td  ><p>Four with propeller guards</p></td><td  ><p>Four with propeller guards</p></td></tr><tr><td class="firstcol " ><p><strong>Max takeoff altitude</strong></p></td><td  ><p>2000m</p></td><td  ><p>2000m</p></td></tr><tr><td class="firstcol " ><p><strong>Max flight distance</strong></p></td><td  ><p>4.34 miles (7km)</p></td><td  ><p>4.34 miles (7km)</p></td></tr><tr><td class="firstcol " ><p><strong>Wind resistance</strong></p></td><td  ><p>10.7 m/s (23.9mph)</p></td><td  ><p>8 m/s (17.9mph)</p></td></tr><tr><td class="firstcol " ><p><strong>Navigation system</strong></p></td><td  ><p>GPS, Galileo, BeiDou</p></td><td  ><p>GLONASS, GPS, Galileo, BeiDou</p></td></tr><tr><td class="firstcol " ><p><strong>Collision avoidance</strong></p></td><td  ><p>Omnidirectional with forward-facing LiDAR</p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Smartphone control</strong></p></td><td  ><p>Yes</p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Internal storage</strong></p></td><td  ><p>Yes, 49GB</p></td><td  ><p>Yes, 22GB</p></td></tr><tr><td class="firstcol " ><p><strong>microSD card slot</strong></p></td><td  ><p>No</p></td><td  ><p>Yes, V30 or higher</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.73 x 6.57 x 2.12 inches (with propeller guards and Digital Transceiver) | 6.73 x 5.78 x 1.61 inches (without Digital Transceiver)</p></td><td  ><p>6.18 x 5.11 x 1.9 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>5.64oz (160g) with Digital Transceiver | 5.32oz (151g) without Digital Transceiver</p></td><td  ><p>4.76oz (135g)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-neo-2-vs-dji-neo-price-availability"><span>DJI Neo 2 vs DJI Neo: Price & availability</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/7AHPhSLViUtqz4uZ57pyAn.jpg" alt="A DJI Neo 2 drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/XKqfv8uQTXHJ3bk9JV5aaL.jpg" alt="DJI Neo - Holding in hand" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The DJI Neo came out in September 2024, and today, it retails for <a href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow">$199</a> / <a href="https://www.amazon.co.uk/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow">£169</a> at Amazon, and you can find it on sale quite often. A year later, the DJI Neo 2 was announced on 13 November 2025, and it is available for <a href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">$319</a> / <a href="https://www.amazon.co.uk/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">£209</a>. If you choose to buy the former, it's available in a light gray matte finish while the latter is dressed in a dark gray one (similar to the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a>).</p><div class="product"><a data-dimension112="7fa2ffad-e937-4553-8253-f797396fd583" data-action="Deal Block" data-label="the DJI Neo costs £169 at Amazon" data-dimension48="the DJI Neo costs £169 at Amazon" data-dimension25="$199" href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B07FTPX71F/" 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="yQ2D9952vwuZALYFFAiFF6" name="Neo-dealbox" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yQ2D9952vwuZALYFFAiFF6.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>A lightweight, compact and minimalistic drone, the DJI Neo is a fantastic drone that can shoot 4K footage at 30fps, take detailed stills, and remain stable in tricky conditions. Easy to control with the new RC-N3 controller or the DJI Fly app on a smartphone, the Neo makes drone photography more accessible thanks to its low price point.</p><p><em>In the U.K., </em><a href="https://www.amazon.co.uk/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow" data-dimension112="7fa2ffad-e937-4553-8253-f797396fd583" data-action="Deal Block" data-label="the DJI Neo costs £169 at Amazon" data-dimension48="the DJI Neo costs £169 at Amazon" data-dimension25="$199"><em>the DJI Neo costs £169 at Amazon</em></a><em>.</em><a class="view-deal button" href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow" data-dimension112="7fa2ffad-e937-4553-8253-f797396fd583" data-action="Deal Block" data-label="the DJI Neo costs £169 at Amazon" data-dimension48="the DJI Neo costs £169 at Amazon" data-dimension25="$199">View Deal</a></p></div><p>The Neo 2 is a little more expensive than its predecessor and I feel like that's a justified price increase, simply because it packs more tech and better features, such as 4K/60fps, omnidirectional obstacle avoidance, Gesture Control, bigger storage, better battery life, and more. I'll discuss all of these features in detail in this face-off.</p><div class="product"><a data-dimension112="efdc2d8e-3312-46f7-9d03-b37f6453775b" data-action="Deal Block" data-label="the DJI Neo 2 costs £209 at Amazon" data-dimension48="the DJI Neo 2 costs £209 at Amazon" data-dimension25="$319" href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1066px;"><p class="vanilla-image-block" style="padding-top:73.17%;"><img id="qR2QDyEkqYwvExK2rTT6Qe" name="DJI-Neo-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/qR2QDyEkqYwvExK2rTT6Qe.png" mos="" align="middle" fullscreen="" width="1066" height="780" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Featuring 4K/60fps video, omnidirectional obstacle avoidance, bigger internal storage, Gesture Control, and more, the DJI Neo 2 makes an already formidable drone a must-have for all pilots. Compact and lightweight, DJI’s latest quadcopter packs power and quality in spades.</p><p><em>In the U.K., </em><a href="https://www.amazon.co.uk/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow" data-dimension112="efdc2d8e-3312-46f7-9d03-b37f6453775b" data-action="Deal Block" data-label="the DJI Neo 2 costs £209 at Amazon" data-dimension48="the DJI Neo 2 costs £209 at Amazon" data-dimension25="$319"><em>the DJI Neo 2 costs £209 at Amazon</em></a><em>.</em><a class="view-deal button" href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow" data-dimension112="efdc2d8e-3312-46f7-9d03-b37f6453775b" data-action="Deal Block" data-label="the DJI Neo 2 costs £209 at Amazon" data-dimension48="the DJI Neo 2 costs £209 at Amazon" data-dimension25="$319">View Deal</a></p></div><p>However, for those of you based in the U.S., it is important to note that the Neo 2 isn't officially available through DJI, and you'll have to do business with third-party retailers, such as Amazon, Walmart and Adorama, instead. This isn't anything new, and it's something we've seen with the Mini 5 Pro and the Mavic 4 Pro as well, as the <a href="https://www.tomsguide.com/cameras-photography/drones/fcc-just-voted-to-retroactively-ban-dji-drones-heres-what-you-need-to-know">DJI ban in the U.S.</a> gets closer to becoming a reality soon.</p><p>This also means that you can't buy a DJI Care Refresh support package for the Neo 2 if you're in the U.S. so if your drone gets damaged, DJI may not be able to help you. The good news, though, is the the original Neo is still officially available through DJI. That means you <em>can</em> get Care Refresh for it, making it the better choice if you don't necessarily want the latest hot tech (and it's still a very, very capable drone).</p><h2 class="article-body__section" id="section-dji-neo-2-vs-dji-neo-design"><span>DJI Neo 2 vs DJI Neo: Design</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/omHSr6jbWVjLZUuzDP6NRi.jpg" alt="A dark gray DJI Neo 2 camera drone" /><figcaption>DJI Neo 2.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/YAqpWaRc6timm3wuSRYMU5.jpg" alt="A gray DJI Neo drone with a camera" /><figcaption>DJI Neo.<small role="credit">Future</small></figcaption></figure></figure><p>As I mentioned earlier, the DJI Neo 2 comes in a dark gray shade — a design choice DJI has opted for all of its recent drone releases — while the DJI Neo comes in a light one. The Neo 2 looks more premium, in my opinion, but I wouldn't write off the Neo so quickly. Both drones are built extremely well, and even though they're lightweight, they don't sound or feel hollow.</p><p>Both the Neo 2 and the Neo are highly compact, and they're DJI's lightest drones. The Neo 2 weighs 5.32oz (151g) without the Digital Transceiver (more on this soon) or 5.64oz (160g) with the new device. The Neo, on the other hand, is a little lighter at 4.76oz. Because of the compact form factor, neither drone needs to be registered with the F.A.A. in the U.S. or the C.A.A. in the U.K., and other airspace governing bodies.</p><p>In terms of their size, the Neo 2 measures 6.73 x 5.78 x 1.61 inches (without Digital Transceiver) or 6.73 x 6.57 x 2.12 inches (with Digital Transceiver), while the Neo is smaller at 6.18 x 5.11 x 1.9 inches. Both drones are highly compact and easy to travel with.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="q26LEz32djdW9YfJeBduPi" name="DJI_Neo_2_ 4.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/q26LEz32djdW9YfJeBduPi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">DJI Neo 2. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>So, what does the Digital Transceiver on the Neo 2 do? It comes pre-installed on certain versions of the drone, and it basically lets you connect the Neo 2 to different DJI accessories, such as the DJI RC controllers and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review">DJI Goggles N3</a> FPV headset. You don't necessarily need the Digital Transceiver, though, as without it, the Neo 2 can be flown via a smartphone or the buttons on its body.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ai3MtKS8JuyhHdmwFAogPi" name="DJI_Neo_2_ 8.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/ai3MtKS8JuyhHdmwFAogPi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You'll also notice that the Neo 2 now has a screen next to the gimbal, and this is a fantastic addition. The screen displays all the settings you’ve adjusted and the QuickShot Intelligent Flight mode, displayed in bright black and white colors. It's easy to read and I much prefer this over the Neo's voice assistant and LED lamps indicating the active settings.</p><h2 class="article-body__section" id="section-dji-neo-2-vs-dji-neo-features"><span>DJI Neo 2 vs DJI Neo: Features</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/UYRbD9yh5oFVyrkvhHkdPi.jpg" alt="A dark gray DJI Neo 2 camera drone" /><figcaption>DJI Neo 2.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/z3BSd3Rqb38qGwweCoGem5.jpg" alt="A gray DJI Neo drone with a camera" /><figcaption>DJI Neo.<small role="credit">Future</small></figcaption></figure></figure><p>A big difference between the DJI Neo 2 and the DJI Neo lies in their ability to avoid obstacles. The first-gen Neo didn't feature any form of obstacle avoidance, but the Neo 2 does. It is now equipped with LiDAR and a downward infrared sensing system, both of which power its omnidirectional obstacle avoidance. This means that the Neo 2 can either bypass or brake in front of objects, reassuring all pilots — beginners as well as veterans.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/cdxdPVGyxNM" allowfullscreen></iframe></div></div><p>The lack of obstacle avoidance is one of the Neo's biggest weaknesses, but the Neo 2 has rectified it, and I'd recommend the Neo 2 over the Neo any day based on this one feature alone. Safety while flying is paramount.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/gQROCX-G1gk" allowfullscreen></iframe></div></div><p>Another big selling point of the Neo 2 is that you can fly it entirely hands-free, thanks to Gesture Control. This has to be enabled via the DJI Fly app before you can use it. Once that's done, you can use your palm(s) to move the drone up and down, side to side, and even increase or decrease its distance to you. It works very well, as you can see in the video above.</p><p>Internal storage has also received a massive bump with the Neo 2 boasting 49GB (versus 22GB on the Neo), but the downside is that the Neo 2 doesn't have a microSD card slot for storage expansion — which the original Neo does. This can become a problem fairly quickly, especially if you're shooting in 4K all the time. While you can use the DJI Fly app to offload footage on the go, it can take time depending on the size of your files, so the Neo 2 concedes a point to the Neo here.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Avooo5QZgXBNdVf5KpcPQi.jpg" alt="A dark gray DJI Neo 2 camera drone" /><figcaption>DJI Neo 2.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hvjPhd3bieCkvBMJKPcxbL.jpg" alt="DJI Neo - Taking off from hand" /><figcaption>DJI Neo.<small role="credit">Future</small></figcaption></figure></figure><p>Additionally, wind resistance has been bumped up from 8 m/s (17.9mph) on the Neo to 10/7 m/s (23.94mph) on the Neo 2. It's important to note, though, that both drone are <em>still </em>susceptible to gusts of wind, due to their light weight, so be wary when you're flying. But because the Neo 2 features a two-axis mechanical gimbal (versus one-axis on the Neo) and DJI's RockSteady technology, the footage is much more stable in very windy conditions.</p><h2 class="article-body__section" id="section-dji-neo-2-vs-dji-neo-photo-video-quality"><span>DJI Neo 2 vs DJI Neo: Photo & video quality</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/XspZ134zKOg" allowfullscreen></iframe></div></div><p>Both the DJI Neo 2 and the DJI Neo utilize a single camera to capture great 12MP photos. Their 1/2-inch CMOS sensors aren't very different from each other, but the Neo 2 has a wider f/2.2 aperture lens (versus f/2.8 on the Neo). This will result in better low-light performance as the camera can use the aperture to let more light in, allowing it to keep to lower ISO values. The Neo 2's ISO range has been bumped up to 100-12,800 too (versus 100-6,400 on the Neo).</p><p>Neither the Neo 2 nor the Neo can shoot RAW photos or videos in D-Log (which pricier DJI drones can), so these aren't exactly "serious" photography quadcopters — which is acceptable, because they're very cheap and are intended more for casual flying and selfies.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iGG0Irjlayo" allowfullscreen></iframe></div></div><p>The biggest difference between the two drones' imaging capabilities lies in their frame rates. While the Neo can shoot 4K/30fps video, the Neo 2 can shoot smoother 4K/60fps. The video above was shot on the Neo 2, and you can see how lovely it looks, in terms of both color and movement.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/jBc3WRBU4G4" allowfullscreen></iframe></div></div><p>Both the Neo and Neo 2 are great selfie drones, perfect for capturing memories, as I did when I was testing the OG Neo. My partner and I took the drone by the river and had a lot of fun with the drone's QuickShot Intelligent Flight modes (the drone records short-form videos before returning to its takeoff point).</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/n6Gs9cwzSIk" allowfullscreen></iframe></div></div><p>There are several QuickShot modes on both drones, such as Circle, Rocket, Follow, Spotlight, etc., and the Neo 2 adds Cycling Follow, Skiing Follow, and SelfieShot to the array. Have a look at all the stunning (and fun!) footage I shot on both drones in my full <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review">DJI Neo 2 review</a> and <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review">DJI Neo review</a>.</p><h2 class="article-body__section" id="section-dji-neo-2-vs-dji-neo-battery-life"><span>DJI Neo 2 vs DJI Neo: Battery life</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Qq3zy9nqUwe9XvKpUcNmPi.jpg" alt="A dark gray DJI Neo 2 camera drone" /><figcaption>DJI Neo 2.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/pf227MQtXVnLmmZQBvAmW6.jpg" alt="A gray DJI Neo drone with a camera" /><figcaption>DJI Neo.<small role="credit">Future</small></figcaption></figure></figure><p>There isn't a huge difference between the DJI Neo 2's and the DJI Neo's flight times, with the former being able to fly just one minute longer between charges. The Neo 2 is rated at 19 minutes while the Neo is rated at 18 minutes... which, in my opinion, doesn't feel like a deciding factor when you're purchasing either drone.</p><p>The short battery lives come down to the Neo 2's and the Neo's light weight and compact body: there's not much else you can fit in there if you want to maintain the drones' diminutive statures. If it's any consolation, the pricier <a href="https://www.tomsguide.com/features/sorry-dji-this-pocketable-folding-drone-is-the-most-fun-ive-had-flying-in-a-long-time">HoverAir X1</a> ($349) and the <a href="https://www.tomsguide.com/cameras-photography/drones/hoverair-x1-pro-promax-review">HoverAir X1 Pro</a> ($499) — also selfie drones — can fly for just 11.5 minutes and 16 minutes respectively. You are, then, getting a great deal with either the Neo or the Neo 2.</p><h2 class="article-body__section" id="section-dji-neo-2-vs-dji-neo-outlook"><span>DJI Neo 2 vs DJI Neo: Outlook</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vAyQ2nY3DPdH7hfbyQ6FBn.jpg" alt="A DJI Neo 2 drone" /><figcaption>DJI Neo 2.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TqXmsN6RHtyq83dR3MWWp4.jpg" alt="A gray DJI Neo drone with a camera" /><figcaption>DJI Neo.<small role="credit">Future</small></figcaption></figure></figure><p><em><strong>Overall winner: DJI Neo 2</strong></em></p><p>If you want a drone that's easy to fly and can be flown hands-free, sports a premium design, omnidirectional obstacle avoidance, bigger internal storage, and records smooth, stable 4K/60fps video, it's a no-brainer that you should get the DJI Neo 2. If you're on a tighter budget, though, and you aren't that bothered about having 60fps  and 22GB of internal storage, or you want a microSD card slot, the DJI Neo is a better shout.</p><p>Both the Neo 2 and the Neo are extremely capable and spectacular drones. I gave both of them 4.5-stars in my reviews. Even though the Neo 2 improves on its predecessor and is <em>the </em>best budget drone today, the Neo is awesome too, and I'm sure you'd be satisfied with either.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYlrAO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYlrAO.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/cameras-photography/drones/dji-neo-2-review">I’ve been testing the DJI Neo 2 and it improves on its predecessor in every way — this is the best budget drone you can buy</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/ive-been-flying-the-dji-neo-for-10-months-heres-my-verdict-spoiler-alert-its-underrated">I've been flying the DJI Neo for 10 months — here's my verdict (spoiler alert: it's underrated)</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2025</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve been testing the DJI Neo 2 and it improves on its predecessor in every way — this is the best budget drone you can buy ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-neo-2-review</link>
                                                                            <description>
                            <![CDATA[ The DJI Neo 2 improves on the Neo by introducing omnidirectional obstacle avoidance, 4K/60fps video, a two-axis mechanical gimbal, and more internal storage. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">ccSYRxvDRT55Xud5iMbJvQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UnipagBjV2JLqbQwuofkRi-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 11 Dec 2025 11:07:12 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:31:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UnipagBjV2JLqbQwuofkRi-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A dark gray DJI Neo 2 camera drone]]></media:description>                                                            <media:text><![CDATA[A dark gray DJI Neo 2 camera drone]]></media:text>
                                <media:title type="plain"><![CDATA[A dark gray DJI Neo 2 camera drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UnipagBjV2JLqbQwuofkRi-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>DJI continues to set new standards with every drone it releases, and the latest to join that lineup is the DJI Neo 2, successor to the one-year-old Neo. When I reviewed the Neo, I absolutely adored the little drone that could, and I have been flying it for more than a year now. I didn’t think DJI could pack even more cutting-edge technology into such a tiny drone, and yet it did.</p><p>The Neo 2 improves on its predecessor in nearly every way. It more-than-doubles the internal storage to 49GB, introduces 4K/60fps video, a two-axis mechanical gimbal, omnidirectional obstacle avoidance, gesture control, stronger wind resistance, and more. It retains the Neo’s best features, such as the impressive tracking, and delivers the quintessential flying experience for beginner pilots on a budget.</p><p>Is it one of the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> right now? Without a doubt. For the complete breakdown, read my full DJI Neo 2 review.</p><h2 class="article-body__section" id="section-dji-neo-2-review-specs"><span>DJI Neo 2 review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p>Specs</p></th><th  ><p>DJI Neo 2</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>Starts at <a href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">$319</a> / <a href="https://www.amazon.co.uk/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">£209</a></p></td></tr><tr><td class="firstcol " ><p><strong>Flight time</strong></p></td><td  ><p>19 minutes</p></td></tr><tr><td class="firstcol " ><p><strong>FAA/CAA registration</strong></p></td><td  ><p>Not required</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>One</p></td></tr><tr><td class="firstcol " ><p><strong>Image sensor</strong></p></td><td  ><p>12MP 1/2-inch CMOS</p></td></tr><tr><td class="firstcol " ><p><strong>ISO</strong></p></td><td  ><p>100-12,800 (Stills) | 100-12,800 (Video)</p></td></tr><tr><td class="firstcol " ><p><strong>Shutter speed</strong></p></td><td  ><p>1/8000-1/10s (Stills) | 1/8,000s-1/30s (Video)</p></td></tr><tr><td class="firstcol " ><p><strong>Aperture</strong></p></td><td  ><p>f/2.2</p></td></tr><tr><td class="firstcol " ><p><strong>Focus</strong></p></td><td  ><p>0.7m to ∞</p></td></tr><tr><td class="firstcol " ><p><strong>Max video resolution</strong></p></td><td  ><p>4K/60fps, 4K/100fps, 2.7K/60fps, FHD/100fps</p></td></tr><tr><td class="firstcol " ><p><strong>Stabilization</strong></p></td><td  ><p>Two-axis mechanical gimbal</p></td></tr><tr><td class="firstcol " ><p><strong>Indoor use</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Propellers</strong></p></td><td  ><p>Four with propeller guards</p></td></tr><tr><td class="firstcol " ><p><strong>Max takeoff altitude</strong></p></td><td  ><p>2000m</p></td></tr><tr><td class="firstcol " ><p><strong>Max flight distance</strong></p></td><td  ><p>4.34 miles (7km)</p></td></tr><tr><td class="firstcol " ><p><strong>Navigation system</strong></p></td><td  ><p>GPS, Galileo, BeiDou</p></td></tr><tr><td class="firstcol " ><p><strong>Collision avoidance</strong></p></td><td  ><p>Omnidirectional with forward-facing LiDAR</p></td></tr><tr><td class="firstcol " ><p><strong>Smartphone control</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Internal storage</strong></p></td><td  ><p>Yes, 49GB</p></td></tr><tr><td class="firstcol " ><p><strong>microSD card slot</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.73 x 6.57 x 2.12 inches (with propeller guards and Digital Transceiver) | 6.73 x 5.78 x 1.61 inches (without Digital Transceiver)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>5.64oz (160g) with Digital Transceiver | 5.32oz (151g) without Digital Transceiver</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-neo-2-review-cheat-sheet"><span>DJI Neo 2 review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>The successor to 2024's DJI Neo</li><li><strong>Who is it for? </strong>Beginner photographers looking for an easy-to-fly or selfie drone, and one that doesn’t break the bank</li><li><strong>How much does it cost? </strong>The DJI Neo 2 starts at <a href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">$319</a> / <a href="https://www.amazon.co.uk/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">£209</a></li><li><strong>What do we like?</strong> Improved camera performance and 4K/60fps video, bigger internal storage, impressive tracking and gesture controls, and omnidirectional obstacle avoidance</li><li><strong>What don’t we like? </strong>Battery life isn't the best and there's no MicroSD slot for expanding storage</li></ul><h2 class="article-body__section" id="section-dji-neo-2-review-price-availability"><span>DJI Neo 2 review: Price & availability</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="udBDNmJfUzNMSN6wZRqgRi" name="DJI_Neo_2_ 12.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/udBDNmJfUzNMSN6wZRqgRi.jpg" mos="" align="middle" fullscreen="" width="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>Launched on November 13, 2025, the DJI Neo 2 succeeds the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review">DJI Neo</a> which came out in September 2024. Priced a little higher than its predecessor, the Neo 2 starts at <a href="https://www.amazon.com/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">$319</a> / <a href="https://www.amazon.co.uk/DJI-Lightweight-Foldable-ActiveTrack-Omnidirectional/dp/B0FJ1S18HF/" target="_blank" rel="nofollow">£209</a> for just the drone, with the Fly More Combo retailing for <a href="https://www.adorama.com/djineo2combo.html" target="_blank" rel="nofollow">$419</a> / <a href="https://www.amazon.co.uk/DJI-ActiveTrack-Omnidirectional-Obstacle-Batteries/dp/B0FJ1F5QZM/" target="_blank" rel="nofollow">£289</a> — this bundle includes two Intelligent Flight Batteries and a two-way charging hub. There’s also a Motion Fly More Combo which costs <a href="https://www.adorama.com/djineo2mfmc.html" target="_blank" rel="nofollow">$709</a> / <a href="https://www.amazon.co.uk/DJI-Transmission-Transceiver-Beginners-Batteries/dp/B0FJ1QH15P/" target="_blank" rel="nofollow">£509</a> and includes the DJI Goggles N3 and a DJI RC Motion 3 controller.</p><p>The Neo 2 is the most budget-friendly selfie drone on the market right now, undercutting the <a href="https://www.tomsguide.com/features/sorry-dji-this-pocketable-folding-drone-is-the-most-fun-ive-had-flying-in-a-long-time">HoverAir X1</a> ($329) and the <a href="https://www.tomsguide.com/cameras-photography/drones/hoverair-x1-pro-promax-review">HoverAir X1 Pro</a> ($499) — and it outdoes both of them when it comes to performance.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2U4FqD6XYgNntk97HcduPi" name="DJI_Neo_2_.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/2U4FqD6XYgNntk97HcduPi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’ll notice that the U.S. prices are much higher than the U.K. prices. This is due to U.S. trade tariffs. Also, at the time of writing, DJI is facing federal issues in the U.S., meaning the Neo 2 isn’t officially supported in the States. </p><p>The Neo 2 is available in the U.S., but you can't buy it directly from DJI's website as the manufacturer doesn't currently support the product in the States. However, like the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a>, which became available to buy through Amazon, Best Buy, Walmart, etc after launch, the Neo 2 is also available in the U.S. through third parties.</p><p>So, Americans can still get their hands on a Neo 2. What then? The bigger issue of DJI not officially marketing the product in the U.S. is lack of both short- and long-term support. As with other DJI products in the U.S. right now, you can't buy a DJI care plan for the Neo 2 — so what happens if it breaks? We also can’t guarantee that the DJI Fly app will continue work in the U.S. so American pilots should be cautious when buying the Neo 2. </p><p>We've yet to see an outcome in DJI's federal woes, but if this is enough to put you off buying the Neo 2, you can check out the original Neo, which is still supported officially by DJI in the U.S., or the HoverAir X1 if you want to be free of DJI's baggage entirely.</p><h2 class="article-body__section" id="section-dji-neo-2-review-design"><span>DJI Neo 2 review: Design</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sbC7XJWfMPGDAFtAiHCkQi" name="DJI_Neo_2_ 11.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/sbC7XJWfMPGDAFtAiHCkQi.jpg" mos="" align="middle" fullscreen="" width="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 DJI Neo 2 looks like the Neo all grown up. Now wrapped in dark grey colors just like the DJI Mini 5 Pro, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review">DJI Air 3S</a> and the DJI Mavic 4 Pro, it looks great and more premium — and I love this design choice DJI has made.</p><p>One of the biggest differences between the Neo and the Neo 2 lies in the Digital Transceiver on the latter, which comes pre-installed on certain versions of the drone. This, basically, allows the Neo 2 to connect to different DJI accessories, such as the DJI RC-N3 controller and the DJI Goggles N3. You don’t necessarily need the Digital Transceiver, though, as without it, the Neo 2 can be flown via a smartphone or controller-free via the buttons on its body.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="q26LEz32djdW9YfJeBduPi" name="DJI_Neo_2_ 4.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/q26LEz32djdW9YfJeBduPi.jpg" mos="" align="middle" fullscreen="" width="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>Although the colors have changed and a new device has been added, the Neo 2 retains the Neo’s sub-250g weight and small size. The Neo 2 measures 6.73 x 6.57 x 2.12 inches with the Digital Transceiver or 6.73 x 5.78 x 1.61 inches without it. Because of the inclusion of a two-axis mechanical gimbal (versus one-axis on the Neo), a bigger battery and more sensors for obstacle avoidance, the Neo 2 weighs 5.64oz (with Digital Transceiver) or 5.32oz (without Digital Transceiver). While it’s a little heavier than the Neo, its sub-250g weight means you don’t need to register the drone with the F.A.A. in the U.S. or the C.A.A. in the U.K.</p><p>Build quality is sublime as always, and I’d expect nothing less from DJI. Even though the drone is tiny and lightweight, tapping on its body with my fingernails didn’t make its inside sound hollow, so rest assured that you’re getting bang for your buck.</p><h2 class="article-body__section" id="section-dji-neo-2-review-controls"><span>DJI Neo 2 review: Controls</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="omHSr6jbWVjLZUuzDP6NRi" name="DJI_Neo_2_ 1.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/omHSr6jbWVjLZUuzDP6NRi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Similar to the first-gen model, the DJI Neo 2 can be flown hands-free and controller-free, so you don’t need to worry about spending more money on the DJI RC-N3 or DJI RC-2 controllers. Heck, you don’t even really need your smartphone for it! This is thanks to the three buttons on its body.</p><p>On the top, next to the camera, is the power button. On its side, you’ll find a pair of buttons, one of which serves as the takeoff button and the other lets you swap between different QuickShot Intelligent Flight modes, such as Follow, Circle, Rocket, etc., and holding the button lets you change the flying parameters too. This means that you can choose the flying distance and angle (wide, close, high).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ZA2uUGPg6EXjvuehU4aiRi" name="DJI_Neo_2_ 6.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/ZA2uUGPg6EXjvuehU4aiRi.jpg" mos="" align="middle" fullscreen="" width="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>All the buttons are easy to reach and press, and they give good tactile feedback when pressed. I thoroughly appreciate the addition of the third button to the Neo 2, as this meant that I didn’t need to pull out my phone to fire up the DJI Fly app and change settings through it. Hands-free flying has never felt better.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ai3MtKS8JuyhHdmwFAogPi" name="DJI_Neo_2_ 8.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/ai3MtKS8JuyhHdmwFAogPi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>But of course, you can change the settings but how do you know which settings you’ve <em>actually </em>changed or selected? After all, you couldn’t do this on the Neo and the only way to know which QuickShot you’d selected was via the voice assistant telling you so or the LED lamps. Well, this is where my favorite upgrade to the Neo 2 comes into play: its tiny screen located next to the gimbal.</p><p>The screen displays all the settings you’ve adjusted and the QuickShot mode, displayed in bright black and white colors. I found it easy to read in nearly every lighting condition, whether that was in bright sunlight, in the dark, or on an overcast day.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/IEiNTp4MwrY" allowfullscreen></iframe></div></div><p>And of course, the Neo 2 retains the Neo’s palm takeoff and landing technology, so if you place your hand under the Neo 2, it will land in your palm, making it very convenient and negating the need for a stable, rock-free surface.</p><h2 class="article-body__section" id="section-dji-neo-2-review-features"><span>DJI Neo 2 review: Features</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Avooo5QZgXBNdVf5KpcPQi" name="DJI_Neo_2_ 10.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/Avooo5QZgXBNdVf5KpcPQi.jpg" mos="" align="middle" fullscreen="" width="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>Although the DJI Neo was a fantastic drone packed full of features ideal for beginner shooters, the DJI Neo 2 has improved on them, making it <em>the </em>best budget drone you can buy today.</p><p>Flight distance has remained the same (7 miles on both drones), but internal storage has more than doubled on the Neo 2. Instead of just 22GB on the Neo, the Neo 2 now features 49GB of internal storage. </p><p>This, however, comes at a major cost: there’s no microSD card slot to expand the storage anymore. Footage can fairly quickly be offloaded via the DJI Fly app, and transfer speeds have been amped up to 80mbps (versus 25mbps on the Neo), so you can transfer a decent amount of 4K/60fps video in under 10 minutes. But that's downtime you simply wouldn't need to take if you were able to keep switching out MicroSD cards.</p><h2 id="gimbal">Gimbal</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="92Wn4rSvkY27EosWgxSTSi" name="DJI_Neo_2_ 2.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/92Wn4rSvkY27EosWgxSTSi.jpg" mos="" align="middle" fullscreen="" width="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 Neo featured a single-axis mechanical gimbal, which meant that even the slightest control movements would gravely affect the stability of the footage. The Neo 2, on the other hand, features an upgraded two-axis mechanical gimbal for tilting and rolling. This, when combined with the RockSteady electronic image stabilization (present on many DJI drones and action cameras), results in more stable footage and enables the Neo 2 to keep the horizon level while shooting.</p><p>Pricier drones usually feature three-axis mechanical gimbals which give you even more stability and creative freedom by allowing you to pan, tilt and roll — but like I said, they cost more. You’ll need to consider the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review">DJI Flip</a> ($439) or the <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review">Potensic Atom 2</a> ($329) if that’s a must-have for you.</p><h2 id="wind-resistance-2">Wind resistance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EfygCYfBw5LRmQrYXPTMQi" name="DJI_Neo_2_ 3.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/EfygCYfBw5LRmQrYXPTMQi.jpg" mos="" align="middle" fullscreen="" width="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 Neo 2’s ability to resist strong winds has received an upgrade over its predecessor too. While the Neo could resist winds up to 8 m/s or 17.9mph (level 4), the Neo 2 takes it up a notch and can resist winds up to 10.7 m/s or 23.9mph (level 5). In my testing, the drone remained stable in very windy conditions, as my phone app noted that on one occasion, the wind speed was 15mph!</p><p>But keep in mind that because the Neo 2 is so lightweight, it is still susceptible to strong and sudden gusts of wind — just like the Neo. I recommend always keeping an eye on the drone when you’re flying it, and ensuring you don’t fly it too high to save it from gusts (at least when it’s extremely windy and unpredictable).</p><p>This is the same level of wind resistance you’ll find on pricier drones, such as the DJI Flip, the <a href="https://www.tomsguide.com/reviews/5-things-i-like-about-the-dji-mini-4-pro-and-2-things-i-hate">DJI Mini 4 Pro</a> ($759), and the Potensic Atom 2, so it’s commendable that DJI has packed the same tech into the Neo 2.</p><h2 id="obstacle-avoidance-2">Obstacle avoidance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UYRbD9yh5oFVyrkvhHkdPi" name="DJI_Neo_2_ 5.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/UYRbD9yh5oFVyrkvhHkdPi.jpg" mos="" align="middle" fullscreen="" width="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 main criticisms of the Neo rested in the fact that it did not feature any form of obstacle avoidance — which, back then, didn’t feel like a major drawback considering the drone cost just $199. Imagine my surprise when I found out that the Neo 2 features omnidirectional obstacle avoidance powered by forward-facing LiDAR and a downward infrared sensing system. This massively reduces the likelihood of potential crashes.</p><p>In my testing, the Neo 2 easily bypassed obstacles, such as trees and branches. It’s important to note that obstacle avoidance doesn’t work when using QuickShot modes, but the Neo 2’s propeller guards act as bumpers and protect the drone in case it flies into an object.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/cdxdPVGyxNM" allowfullscreen></iframe></div></div><p>In the video above, you can see the drone bypass the massive tree. And although it looks like it’s stuck in the tree branches, it slowly gathers its bearings and makes its way past them. Omnidirectional obstacle avoidance will be especially useful when flying the drone through the DJI Goggles N3 FPV headset as it’ll enable you to move the Neo 2 more freely, and I can’t wait to try that.</p><p>The Neo 2’s return-to-home feature is also more refined now that it can avoid obstacles on its way back to you. You can either hit the RTH button on the RC-N3 controller or tap on it in the DJI Fly app, and the drone will promptly return to its last takeoff position when it’s low on battery too.</p><h2 class="article-body__section" id="section-dji-neo-2-review-image-quality"><span>DJI Neo 2 review: Image quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1084px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="uyoGtCuqUTC63VQbFCpdUi" name="DJI_Neo_2_ 9A.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/v2/t:414,l:1037,cw:1084,ch:610,q:80/uyoGtCuqUTC63VQbFCpdUi.jpg" mos="" align="middle" fullscreen="" width="2560" height="1096" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unlike its more advanced family members, the DJI Neo 2 isn’t a professional drone camera, per se. It packs enough imaging prowess to suffice the needs of beginner or casual drone pilots. Featuring the same 1/2-inch CMOS sensor as its predecessor, the Neo 2 can capture 12MP images, and while that number might not sound like a lot, remember that 4K only needs around 8MP of resolution. It packs enough detail for sharing stills and video to social media. </p><p>The 119.8° field of view (16.5mm full frame equivalent) is wide and doesn’t add much corner distortion, making the Neo 2 great for capturing landscapes. Aperture is fixed at f/2.2 (versus f/2.8 on the Neo) and the drone has an ISO range of 100-12,800, resulting in slightly improved low-light performance. You can also adjust the Neo 2’s shutter speed (1/8000-1/10s) when using the DJI Fly app, giving manual shooters more control.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/q9WnPCL8H9NV4KoxB4xEFk.jpg" alt="a photo taken on a DJI Neo 2 camera drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bBjvxDdzSJegEkcMTiTHDk.jpg" alt="a photo taken on a DJI Neo 2 camera drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/r9DBHaSK8HwUyRRrEYHS3k.jpg" alt="a photo taken on a DJI Neo 2 camera drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/MX7LhdGzNKW2i2RD2CjJJk.jpg" alt="a photo taken on a DJI Neo 2 camera drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>Images taken on the Neo 2 turn out well and detailed, as you can see in the shots of the Royal Crescent, Bath, U.K. above. The details in the historical building look great as you can clearly see each individual window pane. I love the look of the blue sky and clouds (captured right after it had rained) too, as well as the lush green grass.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/cQP3GJjgAVEyp7s9KkFMSk.jpg" alt="a photo taken on a DJI Neo 2 camera drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/7ZJJAEBeWdguZKpTNasTNk.jpg" alt="a photo taken on a DJI Neo 2 camera drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/TgucZ5Ra2NHiHxQzJtfwLk.jpg" alt="a photo taken on a DJI Neo 2 camera drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>The Neo 2 features plenty of QuickShot Intelligent Flight Modes (more on that soon), and one of them is SelfieShot. Through the DJI app, you can select the number of photos you want the drone to capture and the angle (medium, high, wide, etc.). The drone will then take the photos before returning to its takeoff position.</p><p>I tried this out with a few different angles, as you can see in the gallery above, and I love the results. This is a fantastic feature to have not just for selfies, but for group shots too.</p><p>Another reason why the Neo 2 isn’t as serious of a camera drone as, say, the DJI Flip or the DJI Mini 5 Pro, is because you can’t shoot RAW photos for more freedom in post-production, and ND filters can’t be attached to the lens either. Oh, and there are no color profiles to choose from except for the Standard one. I will say, though, these are not major flaws. Given that the Neo 2 doesn’t cost a lot, these are sacrifices I’m willing to make for the price of admission.</p><h2 class="article-body__section" id="section-dji-neo-2-review-video-quality"><span>DJI Neo 2 review: Video quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:758px;"><p class="vanilla-image-block" style="padding-top:56.20%;"><img id="2U4FqD6XYgNntk97HcduPi" name="DJI_Neo_2_.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/v2/t:472,l:727,cw:758,ch:426,q:80/2U4FqD6XYgNntk97HcduPi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When I tested the DJI Neo, it didn’t give me much to complain about when it came to its video quality. 4K/30fps felt more than enough, given the size and price of the drone. The Neo 2 can now shoot 4K/60fps, 2.7K/60fps, and 4K/100fps or FHD/100fps slow-mo footage, so it <em>really </em>doesn’t give you much to moan about.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iGG0Irjlayo" allowfullscreen></iframe></div></div><p>4K/60fps footage looks lovely with vivid colors and plenty of detail, as you can see above. Whether you’re panning or ascending and descending, the movement appears smooth and stable, thanks to the two-axis mechanical gimbal. It trumps the Neo’s 4K/30fps footage in every way.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/MdLs1Lk06S8" allowfullscreen></iframe></div></div><p>The Neo 2 is also capable of shooting 2.7K/60fps footage in the 9x16 format, making it ideal for those who want to share their videos on Instagram Reels and Stories, TikTok or YouTube Shorts. This is something that wasn’t present on the Neo so it’s a welcome addition. It’s still not ‘true’ vertical video as the Neo 2 doesn’t feature a rotating gimbal like on the DJI Mini 5 Pro, but it’s still impressive. You can see what this footage looks like above.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/n6Gs9cwzSIk" allowfullscreen></iframe></div></div><p>The Neo 2 is, first and foremost, a selfie drone. To that effect, its array of QuickShot Intelligent Flight modes is its biggest selling point. These AI-powered modes lock on to you (or your preferred subject) and record short-form videos before returning to the takeoff point.</p><p>The Neo 2 features many QuickShot modes, including but not limited to Follow, Cycling Follow, Skiing Follow, SelfieShot, Dolly Zoom, Dronie, Circle, Rocket, Spotlight, Helix, and Boomerang. They’re all fantastic and can be used depending on your shooting requirements. You can see a few examples in the compilation above. I love playing with QuickShot modes and I can almost guarantee that other pilots will too.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/gQROCX-G1gk" allowfullscreen></iframe></div></div><p>Another thing I want to elaborate on is the Neo 2’s Gesture Control, which made me feel like a Jedi Master, as you can see in the clip above. You must enable this feature via the DJI Fly app, and the app will even give you a quick tutorial on how to control the drone with your hands.</p><p>Your palm must face the drone, and a dark blue LED lamp will light up to indicate the Neo 2 is registering your commands. You can then use your palm to move the drone up, down, and side to side, and you can use both palms to either pull the drone closer or push it away. It worked extremely well in my testing, as you can see in the video above, and I thoroughly enjoyed testing this feature. <em>This </em>is what true hands-free flying looks like.</p><h2 class="article-body__section" id="section-dji-neo-2-review-battery-life"><span>DJI Neo 2 review: Battery life</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qq3zy9nqUwe9XvKpUcNmPi" name="DJI_Neo_2_ 7.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/Qq3zy9nqUwe9XvKpUcNmPi.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There isn’t a huge difference between the DJI Neo 2’s and the DJI Neo’s flight times, but the former has received a <em>very </em>minor bump. The Neo 2 can fly for up to 19 minutes between charges (versus 18 minutes on the Neo) — barely any difference, really. The flight time will, of course, vary depending on the flight and environmental conditions.</p><p>To test the battery, I flew the Neo 2 indoors, in a windless environment, and the drone promptly returned to home after hovering for approximately 20 minutes. Again, I got one minute over the stated time because of the environment I conducted the test in. I recommend always carrying fully charged extra batteries when you’re heading out.</p><h2 class="article-body__section" id="section-dji-neo-2-review-verdict"><span>DJI Neo 2 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UnipagBjV2JLqbQwuofkRi" name="DJI_Neo_2_ 9.JPG" alt="A dark gray DJI Neo 2 camera drone" src="https://cdn.mos.cms.futurecdn.net/UnipagBjV2JLqbQwuofkRi.jpg" mos="" align="middle" fullscreen="" width="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 latest addition to DJI’s lineup of drones is a triumph. The DJI Neo 2 takes things up a notch by improving in areas its predecessor lacked in. Now featuring omnidirectional obstacle avoidance, 4K/60fps video, bigger internal storage, and features like Gesture Control, the Neo 2 is everything I’ve ever wanted in a tiny drone and one that doesn’t break the bank.</p><p>The lack of a MicroSD slot is disappointing, and while battery life has been boosted, it still isn't great. But remember, this is a budget drone aimed at beginners and casual users — for those people, I think its internal storage and 19-minute flight time should be enough.</p><p>Although it features competition from the likes of HoverAir, the Neo 2 does everything HoverAir drones do but at a much more accessible price. The drone looks fantastic, it’s built extremely well, looks pricier than it is, and gives you access to FPV flying as it’s compatible with DJI’s headsets. All these features help the Neo 2 make a compelling case for being the best budget drone today.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The DJI Osmo Pocket 4 has been spotted in the wild — and it could be coming before the New Year ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/the-dji-osmo-pocket-4-has-been-spotted-in-the-wild-and-it-could-be-coming-before-the-new-year</link>
                                                                            <description>
                            <![CDATA[ A new leak shows the rumored DJI Osmo Pocket 4 next to the DJI Osmo Pocket 3, hinting at potential upgrades and a release date. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iRUGMVn4P7EWWQ2GjGaNX7</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fEGWGjbSdBhQCuW8xdo9Am-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 10 Dec 2025 14:38:31 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/fEGWGjbSdBhQCuW8xdo9Am-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Osmo Pocket 3 held in hand]]></media:description>                                                            <media:text><![CDATA[DJI Osmo Pocket 3 held in hand]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Osmo Pocket 3 held in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fEGWGjbSdBhQCuW8xdo9Am-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For the last couple of months, rumors about the DJI Osmo Pocket 4 (the potential successor to the <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3">DJI Osmo Pocket 3</a>) have been making the rounds online. Although the Chinese manufacturer has kept its lips sealed on the subject, there is evidence online to suggest that the Osmo Pocket 4 may drop sooner than expected — perhaps before the end of this year.</p><p>To fuel the speculation, a new leak from a reliable source shows the Osmo Pocket 4 in action, next to its predecessor. Igor Bogdanov (<a href="https://x.com/Quadro_News/" target="_blank" rel="nofollow">@Quadro_News on X</a>) took to the social media platform to share this video, which is more hi-res than any other we've seen so far.</p><div class="see-more see-more--clipped"><blockquote class="twitter-tweet hawk-ignore" data-lang="en"><p lang="en" dir="ltr">👉Who's this handsome guy we have here? Our DJI Osmo Pocket 4.#osmopocket4 pic.twitter.com/8ejsdFBaLx<a href="https://twitter.com/cantworkitout/status/1998429297179070533">December 9, 2025</a></p></blockquote><div class="see-more__filter"></div></div><p>Although Bogdanov has chosen not to elaborate further on the unreleased gimbal camera, he has explicitly mentioned the product's full name. So, what can we garner from the short clip? Firstly, it looks like the Osmo Pocket 4 houses a bigger camera than the Osmo Pocket 3.</p><p>While online users are speculating that the Osmo Pocket 4 will feature two cameras instead of one, we can't say that for certain until we get a good look of the front — and I can't imagine that happening before DJI officially announces the Osmo Pocket 4. We can also see that the Osmo Pocket 4 will retain its predecessor's rotatable display, which can be used to shoot either landscape or portrait video.</p><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="7cXRsN75YUk8oF8wifdEMA" name="OP4-rumor" alt="A screenshot showing FCC registration for the DJI Osmo Pocket 4" src="https://cdn.mos.cms.futurecdn.net/7cXRsN75YUk8oF8wifdEMA.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: FCC)</span></figcaption></figure><p>So, when is the Osmo Pocket 4 dropping? There hasn't been any official mention of it, but we know that the <a href="https://apps.fcc.gov/eas/GetApplicationAttachment.html?id=8812261" target="_blank" rel="nofollow">Osmo Pocket 4 has been formally registered with the FCC</a>. A launch could, then, be imminent, and we might even see it before the end of the year — this gives DJI three weeks before 2026 begins, or <a href="https://www.tomsguide.com/cameras-photography/drones/fcc-just-voted-to-retroactively-ban-dji-drones-heres-what-you-need-to-know">two weeks if the DJI drone ban goes through in the U.S. on 23 December</a>.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/fR78DgezjsLUtSjFLYpxxm.jpg" alt="FCC documents showing information about the DJI Osmo Pocket 4" /><figcaption><small role="credit">FCC</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/pB8yJTe3XR3UaLehtV3hxm.jpg" alt="FCC documents showing information about the DJI Osmo Pocket 4" /><figcaption><small role="credit">FCC</small></figcaption></figure></figure><p>FCC documents, however, don't reveal much else in terms of video specs, but they do indicate that the Osmo Pocket 4 will host a bigger, nearly-20% battery upgrade, mentioning a 1,545mAh battery. For context, the Osmo Pocket 3 houses a 1,300mAh battery. Again, this is speculation, and we won't know the exact details until DJI's official product page goes live.</p><div class="product"><a data-dimension112="d6039ba2-cbde-49f0-9767-f5fb6498a805" data-action="Deal Block" data-label="The DJI Osmo Pocket 3 is a wonderful tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look." data-dimension48="The DJI Osmo Pocket 3 is a wonderful tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look." data-dimension25="$528" href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:425px;"><p class="vanilla-image-block" style="padding-top:252.00%;"><img id="A42QpbMsUGy822dgTrzqi6" name="DJI Osmo Pocket 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/A42QpbMsUGy822dgTrzqi6.jpg" mos="" align="middle" fullscreen="" width="425" height="1071" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Osmo Pocket 3 is a wonderful tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD/" target="_blank" rel="nofollow" data-dimension112="d6039ba2-cbde-49f0-9767-f5fb6498a805" data-action="Deal Block" data-label="The DJI Osmo Pocket 3 is a wonderful tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look." data-dimension48="The DJI Osmo Pocket 3 is a wonderful tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look." data-dimension25="$528">View Deal</a></p></div><p>It remains to be seen whether we'll see the Osmo Pocket 4 before we enter the new year, but if you can't wait for that, you can buy an <a href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD/" target="_blank" rel="nofollow">Osmo Pocket 3 for 34% off at Amazon</a> right now, so it's down to just $528. We awarded the camera 4.5 stars in our <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3">Osmo Pocket 3 review</a>, commending it for its awesome stabilization, 4K video, strong low-light performance, superb build, and more.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3">DJI Osmo Pocket 3 review</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/fcc-just-voted-to-retroactively-ban-dji-drones-heres-what-you-need-to-know">DJI drone ban just got one step closer after FCC vote — what you need to know</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2025</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test action cameras for a living — 19 Black Friday deals I recommend ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/action-camera-deals-black-friday-2025</link>
                                                                            <description>
                            <![CDATA[ Black Friday action camera deals are live, and there's never been a better time to scoop up a GoPro, DJI or Insta360 camera. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">R8qRe7txnM93mv62SFNBWM</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/iyMBjxnnZW4HqesfyMAB7o-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 26 Nov 2025 10:12:34 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/iyMBjxnnZW4HqesfyMAB7o-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A GoPro MAX2 on a stone surface against a blue background with a Tom&#039;s Guide Black Friday deal badge in the bottom right corner of the image.]]></media:description>                                                            <media:text><![CDATA[A GoPro MAX2 on a stone surface against a blue background with a Tom&#039;s Guide Black Friday deal badge in the bottom right corner of the image.]]></media:text>
                                <media:title type="plain"><![CDATA[A GoPro MAX2 on a stone surface against a blue background with a Tom&#039;s Guide Black Friday deal badge in the bottom right corner of the image.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/iyMBjxnnZW4HqesfyMAB7o-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With only two days to go until the big day itself, many <a href="https://www.tomsguide.com/live/news/black-friday-deals-ultimate-guide-my-top-picks-2025">Black Friday deals</a> have already gone live, including on action cameras. I'm Pete, a senior editor here at Tom's Guide, responsible for all our cameras coverage. I track prices of the <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action cameras</a> and <a href="https://www.tomsguide.com/us/best-360-cameras,review-3737.html">best 360 cameras</a> throughout the year.</p><p>Black Friday is usually the best time of the year to pick up a new action camera, and this year is no exception. I'm seeing all three major brands slashing prices, with an especially concerted effort from GoPro this year — it has cut prices on virtually its entire range, including the very latest <a href="https://gopro.com/en/us/shop/cameras/buy/max2/CHDHZ-311-master.html" target="_blank" rel="nofollow">GoPro MAX2, launched only a few weeks back, now $100 off at GoPro</a> with a 12M GoPro Premium subscription included. </p><p>My favorite deal, though, is still the <a href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" target="_blank" rel="nofollow">DJI Osmo Action 5 Pro Essential Combo, currently just $259 at Amazon</a> — that's the cheapest price ever for my top rated action camera.</p><p>I review every single action camera from the major manufacturers, so each entry on this list has been past me personally. Some I'm currently testing right now, and I even own (or have owned) most of them!</p><p>I'll be tracking all the prices throughout the sales event. I've included my analysis for each entry to help you decide whether to buy right away, or keep an eye to see if prices drop further as we get reach Friday itself.</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><a href="https://www.amazon.com/blackfriday" target="_blank" rel="nofollow"><strong>Check out Amazon's Black Friday deals now!</strong></a></li><li><strong>GoPro Hero (2024): </strong><a href="https://www.amazon.com/GoPro-Hero-Ecommerce-Packaging-Waterproof/dp/B0FCTZ1GLY/" target="_blank" rel="nofollow"><strong>was $219 now $179 @ Amazon</strong></a><strong></strong></li><li><strong>GoPro LIT Hero (+12M GoPro Sub): </strong><a href="https://gopro.com/en/us/shop/cameras/buy/lit-hero/CHDHF-132-master.html" target="_blank" rel="nofollow"><strong>was $269 now $229 @ GoPro</strong></a><strong></strong></li><li><strong>DJI Osmo Action 5 Pro Essential Combo: </strong><a href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" target="_blank" rel="nofollow"><strong>was $339 now $259 @ Amazon</strong></a><strong></strong></li><li><strong>Insta360 X4: </strong><a href="https://www.amazon.com/Insta360-Standard-Bundle-Waterproof-Stabilization/dp/B0DBQBMQH2" target="_blank" rel="nofollow"><strong>was $429 now $299 @ Amazon</strong></a><strong></strong></li><li><strong>GoPro Hero12 Black (+12M GoPro Sub): </strong><a href="https://gopro.com/en/us/shop/cameras/hero12-black/CHDHX-121-master.html" target="_blank" rel="nofollow"><strong>was $369 now $299 @ GoPro</strong></a></li><li><strong>GoPro Hero13 Black (+12M GoPro Sub): </strong><a href="https://gopro.com/en/us/shop/cameras/buy/hero13black/CHDHX-131-master.html?option-id=CHDHX-131-master" target="_blank" rel="nofollow"><strong>was $429 now $319 @ GoPro</strong></a></li><li><strong>GoPro Hero13 Black Extended bundle (+12M GoPro Sub): </strong><a href="https://gopro.com/en/us/shop/cameras/buy/hero13black/CHDHX-131-master.html?option-id=CHDRB-134-master" target="_blank" rel="nofollow"><strong>was $499 now $349 @ GoPro</strong></a></li><li><strong>DJI Osmo 360: </strong><a href="https://www.amazon.com/DJI-Standard-Imaging-Recording-Waterproof/dp/B0DTTZZ6Q3" target="_blank" rel="nofollow"><strong>was $549 now $347 @ Amazon</strong></a></li><li><strong>GoPro MAX2 (+12M GoPro Sub): </strong><a href="https://gopro.com/en/us/shop/cameras/buy/max2/CHDHZ-311-master.html" target="_blank" rel="nofollow"><strong>was $499 now $449 @ GoPro</strong></a><strong></strong></li><li><strong>Insta360 X5: </strong><a href="https://www.amazon.com/Insta360-Waterproof-Replaceable-Built-Stabilization/dp/B0DZCBYCNY" target="_blank" rel="nofollow"><strong>was $549 now $464 @ Amazon</strong></a></li></ul><h2 class="article-body__section" id="section-black-friday-gopro-deals"><span>Black Friday GoPro deals</span></h2><div class="product"><a data-dimension112="7cd201a1-3af5-4d54-9668-2206748bbbb4" data-action="Deal Block" data-label="$349 @ Amazon" data-dimension48="$349 @ Amazon" data-dimension25="$349" href="https://gopro.com/en/us/shop/cameras/buy/hero13black/CHDHX-131-master.html?option-id=CHDRB-134-master" 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:45.60%;"><img id="F6Cw22dsNETAqZZMSxKyvA" name="GoPro H13 Extended Power Edition" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/F6Cw22dsNETAqZZMSxKyvA.jpg" mos="" align="middle" fullscreen="" width="1500" height="684" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE]</strong> This is my top GoPro deal, as it bundles the fantastic Hero13 Black with extra Enduro batteries, a charging adapter, case and SD card. That's a lot of extra gear, and with this deal it's only $30 pricier than the base Hero13 Black deal below. It's a no-brainer.</p><p><em><strong>Price check: </strong></em><a href="https://www.amazon.com/GoPro-HERO13-Black-Extended-Bundle/dp/B0FKR7PG9W" target="_blank" rel="nofollow" data-dimension112="7cd201a1-3af5-4d54-9668-2206748bbbb4" data-action="Deal Block" data-label="$349 @ Amazon" data-dimension48="$349 @ Amazon" data-dimension25="$349"><em><strong>$349 @ Amazon</strong></em></a><a class="view-deal button" href="https://gopro.com/en/us/shop/cameras/buy/hero13black/CHDHX-131-master.html?option-id=CHDRB-134-master" target="_blank" rel="nofollow" data-dimension112="7cd201a1-3af5-4d54-9668-2206748bbbb4" data-action="Deal Block" data-label="$349 @ Amazon" data-dimension48="$349 @ Amazon" data-dimension25="$349">View Deal</a></p></div><div class="product"><a data-dimension112="33c0e018-9167-44a0-bf40-cc832e7b73e9" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="$319" href="https://gopro.com/en/us/shop/cameras/buy/hero13black/CHDHX-131-master.html?option-id=CHDHX-131-master" 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:72.33%;"><img id="Ji67C96RcGbbNqj45vE5WL" name="GoPro Hero13 Black.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Ji67C96RcGbbNqj45vE5WL.jpg" mos="" align="middle" fullscreen="" width="1500" height="1085" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The GoPro Hero13 Black is GoPro's current flagship action camera. It shoots 5.3K/60fps and is waterproof to 33 feet. Its range of pro features earned it a 4.5* score in my <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-hero13-black-can-the-champ-keep-his-title" data-dimension112="33c0e018-9167-44a0-bf40-cc832e7b73e9" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="$319">GoPro Hero13 Black review</a>. The cheapest I've seen this camera drop is $299 last Black Friday. So, at only $20 pricier, this is a good deal, but it's worth holding off a little to see if this drops further over the week.</p><p><em><strong>Price check: </strong></em><a href="https://www.amazon.com/GoPro-HERO13-Black-Compatability-HB/dp/B0DCM34GXX" target="_blank" rel="nofollow"><em><strong>$319 @ Amazon</strong></em></a><a class="view-deal button" href="https://gopro.com/en/us/shop/cameras/buy/hero13black/CHDHX-131-master.html?option-id=CHDHX-131-master" target="_blank" rel="nofollow" data-dimension112="33c0e018-9167-44a0-bf40-cc832e7b73e9" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="$319">View Deal</a></p></div><div class="product"><a data-dimension112="dee5e3e7-4c27-475e-9d08-d42d8de4b5a6" data-action="Deal Block" data-label="If you'd prefer something with a little more pizzaz than the original black colorway, you can also buy the GoPro Hero13 Black in, well, not black! This limited edition variant is Forest Green, which looks pretty cool in my opinion. It may also be a better shout if you need camouflage — for stashing in bird hides for example. This is currently on sale for the same price as the standard model, so there's really no downside." data-dimension48="If you'd prefer something with a little more pizzaz than the original black colorway, you can also buy the GoPro Hero13 Black in, well, not black! This limited edition variant is Forest Green, which looks pretty cool in my opinion. It may also be a better shout if you need camouflage — for stashing in bird hides for example. This is currently on sale for the same price as the standard model, so there's really no downside." data-dimension25="$319" href="https://gopro.com/en/us/shop/cameras/buy/hero13black/CHDHX-131-master.html?option-id=CHDHX-133-master" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:795px;"><p class="vanilla-image-block" style="padding-top:90.94%;"><img id="XYV7jNhKVi79crhdhRF2gn" name="GoPro H13B Forest Green" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XYV7jNhKVi79crhdhRF2gn.jpg" mos="" align="middle" fullscreen="" width="795" height="723" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you'd prefer something with a little more pizzaz than the original black colorway, you can also buy the GoPro Hero13 Black in, well, not black! This limited edition variant is Forest Green, which looks pretty cool in my opinion. It may also be a better shout if you need camouflage — for stashing in bird hides for example. This is currently on sale for the same price as the standard model, so there's really no downside.<a class="view-deal button" href="https://gopro.com/en/us/shop/cameras/buy/hero13black/CHDHX-131-master.html?option-id=CHDHX-133-master" target="_blank" rel="nofollow" data-dimension112="dee5e3e7-4c27-475e-9d08-d42d8de4b5a6" data-action="Deal Block" data-label="If you'd prefer something with a little more pizzaz than the original black colorway, you can also buy the GoPro Hero13 Black in, well, not black! This limited edition variant is Forest Green, which looks pretty cool in my opinion. It may also be a better shout if you need camouflage — for stashing in bird hides for example. This is currently on sale for the same price as the standard model, so there's really no downside." data-dimension48="If you'd prefer something with a little more pizzaz than the original black colorway, you can also buy the GoPro Hero13 Black in, well, not black! This limited edition variant is Forest Green, which looks pretty cool in my opinion. It may also be a better shout if you need camouflage — for stashing in bird hides for example. This is currently on sale for the same price as the standard model, so there's really no downside." data-dimension25="$319">View Deal</a></p></div><div class="product"><a data-dimension112="363df501-c565-44e7-b4f0-06a499cfef3e" data-action="Deal Block" data-label="Again, if you'd like something a little different to the black colorway, or you need camouflage for snowy environments, the Polar White edition of the Hero13 Black is also on sale for the same price as the standard model." data-dimension48="Again, if you'd like something a little different to the black colorway, or you need camouflage for snowy environments, the Polar White edition of the Hero13 Black is also on sale for the same price as the standard model." data-dimension25="$319" href="https://www.amazon.com/GoPro-Limited-HERO13-Black-Polar/dp/B0DYPJ8GK7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:385px;"><p class="vanilla-image-block" style="padding-top:92.21%;"><img id="hTXvTSpFmefAZJrdZ5dzcN" name="GoPro H13 Black — White" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/hTXvTSpFmefAZJrdZ5dzcN.jpg" mos="" align="middle" fullscreen="" width="385" height="355" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Again, if you'd like something a little different to the black colorway, or you need camouflage for snowy environments, the Polar White edition of the Hero13 Black is also on sale for the same price as the standard model.<a class="view-deal button" href="https://www.amazon.com/GoPro-Limited-HERO13-Black-Polar/dp/B0DYPJ8GK7" target="_blank" rel="nofollow" data-dimension112="363df501-c565-44e7-b4f0-06a499cfef3e" data-action="Deal Block" data-label="Again, if you'd like something a little different to the black colorway, or you need camouflage for snowy environments, the Polar White edition of the Hero13 Black is also on sale for the same price as the standard model." data-dimension48="Again, if you'd like something a little different to the black colorway, or you need camouflage for snowy environments, the Polar White edition of the Hero13 Black is also on sale for the same price as the standard model." data-dimension25="$319">View Deal</a></p></div><div class="product"><a data-dimension112="7c2da668-6857-42c0-8c5a-75de18f71077" data-action="Deal Block" data-label="$369 @ Amazon" data-dimension48="$369 @ Amazon" data-dimension25="$369" href="https://gopro.com/en/us/shop/cameras/buy/hero13-ultra-wide-edition/CHDRB-133-master.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:73.27%;"><img id="HxKdNSqEPkNNA8EXwJavLX" name="GoPro Hero13 Black UW" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HxKdNSqEPkNNA8EXwJavLX.jpg" mos="" align="middle" fullscreen="" width="1500" height="1099" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>One of the Hero13 Black's defining features is its wide array of Lens Mods, with more lenses available than on previous models — from macro, to ultra wide and even anamorphic mods. This Ultra Wide edition gives you a huge 177-degree field of view. It's dropped $110 for Black Friday, although I saw it drop another $40 to $329 last year, so keep an eye on the price as it may drop further.</p><p><em><strong>Price check: </strong></em><a href="https://www.amazon.com/GoPro-HERO13-Black-Ultra-Wide/dp/B0F9RS571F" target="_blank" rel="nofollow" data-dimension112="7c2da668-6857-42c0-8c5a-75de18f71077" data-action="Deal Block" data-label="$369 @ Amazon" data-dimension48="$369 @ Amazon" data-dimension25="$369"><em><strong>$369 @ Amazon</strong></em></a><a class="view-deal button" href="https://gopro.com/en/us/shop/cameras/buy/hero13-ultra-wide-edition/CHDRB-133-master.html" target="_blank" rel="nofollow" data-dimension112="7c2da668-6857-42c0-8c5a-75de18f71077" data-action="Deal Block" data-label="$369 @ Amazon" data-dimension48="$369 @ Amazon" data-dimension25="$369">View Deal</a></p></div><div class="product"><a data-dimension112="4d14c26a-82b6-4781-a371-d561a68f51be" data-action="Deal Block" data-label="GoPro Hero12 Black" data-dimension48="GoPro Hero12 Black" data-dimension25="$299" href="https://gopro.com/en/us/shop/cameras/hero12-black/CHDHX-121-master.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:70.33%;"><img id="F4cXzKCry6aptVvB5DPafi" name="GoPro Hero12 Black.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/F4cXzKCry6aptVvB5DPafi.jpg" mos="" align="middle" fullscreen="" width="1500" height="1055" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/reviews/gopro-hero12-black" data-dimension112="4d14c26a-82b6-4781-a371-d561a68f51be" data-action="Deal Block" data-label="GoPro Hero12 Black" data-dimension48="GoPro Hero12 Black" data-dimension25="$299">GoPro Hero12 Black</a> price has also dropped. I owned this camera for about nine months, and it's still a solid camera. It shoots the same 5.3K/60fps video as the newer Hero13 Black. And the only major difference is that the Hero12 can't use the later model's wider array of lens mods. I've seen this camera drop as low as $249 in last year's Black Friday sales, so keep an eye on this one as I expect to to drop again this week.</p><p><em><strong>Price check: </strong></em><a href="https://www.amazon.com/GoPro-HERO13-Black-Compatability-HB/dp/B0CZMG5L6X" target="_blank" rel="nofollow"><em><strong>$299 @ Amazon</strong></em></a><a class="view-deal button" href="https://gopro.com/en/us/shop/cameras/hero12-black/CHDHX-121-master.html" target="_blank" rel="nofollow" data-dimension112="4d14c26a-82b6-4781-a371-d561a68f51be" data-action="Deal Block" data-label="GoPro Hero12 Black" data-dimension48="GoPro Hero12 Black" data-dimension25="$299">View Deal</a></p></div><div class="product"><a data-dimension112="3de78be5-19ce-48cf-bc40-72cab3d26740" data-action="Deal Block" data-label="GoPro Hero (2024)" data-dimension48="GoPro Hero (2024)" data-dimension25="$179" href="https://www.amazon.com/GoPro-Hero-Ecommerce-Packaging-Waterproof/dp/B0FCTZ1GLY/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1229px;"><p class="vanilla-image-block" style="padding-top:117.66%;"><img id="HZVZimgZUmwFPaXVtKC26V" name="GoPro Hero (2024)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HZVZimgZUmwFPaXVtKC26V.jpg" mos="" align="middle" fullscreen="" width="1229" height="1446" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The tiny <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-hero-2024-review" data-dimension112="3de78be5-19ce-48cf-bc40-72cab3d26740" data-action="Deal Block" data-label="GoPro Hero (2024)" data-dimension48="GoPro Hero (2024)" data-dimension25="$179">GoPro Hero (2024)</a> was GoPro's smallest action camera when it launched (and is now the joint smallest after the LIT Hero release this year). It shoots 4K/30fps video and boasts strong battery life. This camera dropped to $169 earlier in the year and we might see it drop a little further in the coming days. However, this $179 price is level with last year's Black Friday price, so still a decent deal.</p><p><em><strong>Price check: </strong></em><a href="https://gopro.com/en/us/shop/cameras/buy/hero/CHDHF-131-master.html" target="_blank" rel="nofollow"><em><strong>$199 @ GoPro (w/ 12M GoPro subscription)</strong></em></a><a class="view-deal button" href="https://www.amazon.com/GoPro-Hero-Ecommerce-Packaging-Waterproof/dp/B0FCTZ1GLY/" target="_blank" rel="nofollow" data-dimension112="3de78be5-19ce-48cf-bc40-72cab3d26740" data-action="Deal Block" data-label="GoPro Hero (2024)" data-dimension48="GoPro Hero (2024)" data-dimension25="$179">View Deal</a></p></div><div class="product"><a data-dimension112="26028bdf-1b8a-44be-88fb-b16647f441ff" data-action="Deal Block" data-label="$229 @ Amazon" data-dimension48="$229 @ Amazon" data-dimension25="$229.99" href="https://gopro.com/en/us/shop/cameras/buy/lit-hero/CHDHF-132-master.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:516px;"><p class="vanilla-image-block" style="padding-top:87.21%;"><img id="93EVBRECFmu7EF4k2shAdN" name="GoPro LIT Hero" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/93EVBRECFmu7EF4k2shAdN.jpg" mos="" align="middle" fullscreen="" width="516" height="450" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LATEST MODEL] </strong>This GoPro was only launched a few weeks back, so it's great to see it already at a discount. By default, this is its lowest price! It's an updated version of the original Hero (2024), with a built-in front light and some upgraded features. I'm actually midway through testing this camera right now. It offers 4K/60fps as opposed to the 4K/30fps of the original Hero, making it better for fast-paced action content. Yet it's just as tiny, so can be mounted anywhere! Given how new it is, I don't expect this camera to drop much further.</p><p><em><strong>Price check: </strong></em><a href="https://www.amazon.com/GoPro-LIT-Hero-Built-Stabilization/dp/B0FP5R9BDZ" target="_blank" rel="nofollow" data-dimension112="26028bdf-1b8a-44be-88fb-b16647f441ff" data-action="Deal Block" data-label="$229 @ Amazon" data-dimension48="$229 @ Amazon" data-dimension25="$229.99"><em><strong>$229 @ Amazon</strong></em></a><a class="view-deal button" href="https://gopro.com/en/us/shop/cameras/buy/lit-hero/CHDHF-132-master.html" target="_blank" rel="nofollow" data-dimension112="26028bdf-1b8a-44be-88fb-b16647f441ff" data-action="Deal Block" data-label="$229 @ Amazon" data-dimension48="$229 @ Amazon" data-dimension25="$229.99">View Deal</a></p></div><div class="product"><a data-dimension112="63722fb5-2e14-4c0b-bb19-91ac390380cc" data-action="Deal Block" data-label="$399 @ Amazon" data-dimension48="$399 @ Amazon" data-dimension25="$399.99" href="https://gopro.com/en/us/shop/cameras/buy/max2/CHDHZ-311-master.html" 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="orEaFwQNVYzWXYkZWDdp7o" name="GRID GoPro MAX2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/orEaFwQNVYzWXYkZWDdp7o.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LATEST MODEL]</strong> What. A. Camera. In my GoPro MAX2 review, this camera earned 4.5* and a spot on my top 360 cameras guide as "best for pros", because it is. Its pro features like "true" 8K, Log recording and GoPro labs custom firmware make it ideal for serious content creators. This is another camera launched only weeks back, making this the lowest price ever! I doubt it'll drop lower than this given how new it is, so you can buy in confidence now.</p><p><em><strong>Price check: </strong></em><a href="https://www.amazon.com/GoPro-MAX2-Traditional-Replaceable-Stabilization/dp/B0FNGK6JZP" target="_blank" rel="nofollow" data-dimension112="63722fb5-2e14-4c0b-bb19-91ac390380cc" data-action="Deal Block" data-label="$399 @ Amazon" data-dimension48="$399 @ Amazon" data-dimension25="$399.99"><em><strong>$399 @ Amazon</strong></em></a><a class="view-deal button" href="https://gopro.com/en/us/shop/cameras/buy/max2/CHDHZ-311-master.html" target="_blank" rel="nofollow" data-dimension112="63722fb5-2e14-4c0b-bb19-91ac390380cc" data-action="Deal Block" data-label="$399 @ Amazon" data-dimension48="$399 @ Amazon" data-dimension25="$399.99">View Deal</a></p></div><h2 class="article-body__section" id="section-black-friday-dji-deals"><span>Black Friday DJI deals</span></h2><div class="product"><a data-dimension112="6836d6dd-8b9e-41ce-9daa-acd84f845f2f" data-action="Deal Block" data-label="[LOWEST PRICE] If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low $259. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around." data-dimension48="[LOWEST PRICE] If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low $259. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around." data-dimension25="$259" href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5/" 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:84.00%;"><img id="ZjbfZ45E3afFQJCzAjxoiM" name="DJI OA5P QUICK LIST" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZjbfZ45E3afFQJCzAjxoiM.jpg" mos="" align="middle" fullscreen="" width="500" height="420" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE]</strong> If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low $259. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around.<a class="view-deal button" href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5/" target="_blank" rel="nofollow" data-dimension112="6836d6dd-8b9e-41ce-9daa-acd84f845f2f" data-action="Deal Block" data-label="[LOWEST PRICE] If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low $259. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around." data-dimension48="[LOWEST PRICE] If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low $259. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around." data-dimension25="$259">View Deal</a></p></div><div class="product"><a data-dimension112="5dba8e56-9c9f-4a3f-8135-6653a1be07c3" data-action="Deal Block" data-label="DJI Osmo Action 4" data-dimension48="DJI Osmo Action 4" data-dimension25="$199" href="https://www.amazon.com/DJI-Essential-Waterproof-Performance-Long-Lasting/dp/B0DS2B3P2B" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1166px;"><p class="vanilla-image-block" style="padding-top:63.46%;"><img id="WPEZSaK94BRxYeCGATrHdH" name="DJI Osmo Action 4.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WPEZSaK94BRxYeCGATrHdH.jpg" mos="" align="middle" fullscreen="" width="1166" height="740" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE] </strong>The older <a href="https://www.tomsguide.com/reviews/dji-osmo-action-4" data-dimension112="5dba8e56-9c9f-4a3f-8135-6653a1be07c3" data-action="Deal Block" data-label="DJI Osmo Action 4" data-dimension48="DJI Osmo Action 4" data-dimension25="$199">DJI Osmo Action 4</a> is also on sale, and now at its lowest ever price. This camera doesn't offer quite as much finesse as its younger siblings, the Osmo Action 5 Pro and Osmo Action 6, but it's still a fantastic action camera, shooting 4K/60fps content. This is the lowest I've ever seen this camera so if you're looking for a competent budget cam, now is a perfect time to scoop up this deal.<a class="view-deal button" href="https://www.amazon.com/DJI-Essential-Waterproof-Performance-Long-Lasting/dp/B0DS2B3P2B" target="_blank" rel="nofollow" data-dimension112="5dba8e56-9c9f-4a3f-8135-6653a1be07c3" data-action="Deal Block" data-label="DJI Osmo Action 4" data-dimension48="DJI Osmo Action 4" data-dimension25="$199">View Deal</a></p></div><div class="product"><a data-dimension112="ce01f764-24c7-45b6-a6ba-c5ff3e2be507" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$357.49" href="https://www.amazon.com/DJI-Standard-Imaging-Recording-Waterproof/dp/B0DTTZZ6Q3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1090px;"><p class="vanilla-image-block" style="padding-top:137.61%;"><img id="yUXRL4qFis7QUzehxiNGTN" name="DJI Osmo 360" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yUXRL4qFis7QUzehxiNGTN.jpg" mos="" align="middle" fullscreen="" width="1090" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE] </strong>Honestly, I wasn't expecting such a huge deal on this camera given it only launched a few months back. The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review" data-dimension112="ce01f764-24c7-45b6-a6ba-c5ff3e2be507" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$357.49">DJI Osmo 360</a> is currently nearly $200 off, which makes this serious Insta360 X5 and GoPro MAX2 competitor a massive steal. It shoots lovely 8K 360 footage and offers seamless integration with other products in DJI's ecosystem. Given this is the cheapest price ever for this camera, I doubt it'll go much lower, even on Black Friday itself. I'd advise buying this camera now.<a class="view-deal button" href="https://www.amazon.com/DJI-Standard-Imaging-Recording-Waterproof/dp/B0DTTZZ6Q3" target="_blank" rel="nofollow" data-dimension112="ce01f764-24c7-45b6-a6ba-c5ff3e2be507" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$357.49">View Deal</a></p></div><h2 class="article-body__section" id="section-black-friday-insta360-deals"><span>Black Friday Insta360 deals</span></h2><div class="product"><a data-dimension112="2f0edf7d-a966-473a-8524-a9114818dd3c" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="$464.99" href="https://www.amazon.com/Insta360-Waterproof-Replaceable-Built-Stabilization/dp/B0DZCBYCNY" 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:111.40%;"><img id="yGDrsxDPAa6hgWeYP9bM5h" name="Insta360 X5" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yGDrsxDPAa6hgWeYP9bM5h.jpg" mos="" align="middle" fullscreen="" width="500" height="557" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE]</strong> Another huge deal, this time on my top 360 camera, the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x5-review" data-dimension112="2f0edf7d-a966-473a-8524-a9114818dd3c" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="$464.99">Insta360 X5</a>. This is the best 360 camera for most people thanks to its combination of fantastic image quality, excellent audio, its easy to use app and editing software, and its straight-to-social workflow ethos. It's pricey, sure, but it's the best 360 camera on the market, and is now cheaper than ever. I don't see this camera dropping much further this week, so now is a great time to buy.<a class="view-deal button" href="https://www.amazon.com/Insta360-Waterproof-Replaceable-Built-Stabilization/dp/B0DZCBYCNY" target="_blank" rel="nofollow" data-dimension112="2f0edf7d-a966-473a-8524-a9114818dd3c" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="$464.99">View Deal</a></p></div><div class="product"><a data-dimension112="ca611ff7-2f80-4192-a87b-b6b229ea7688" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="$299.99" href="https://www.amazon.com/Insta360-Standard-Bundle-Waterproof-Stabilization/dp/B0DBQBMQH2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:135px;"><p class="vanilla-image-block" style="padding-top:262.96%;"><img id="Zekb84rtFtrZC48rT29n5a" name="Insta360 X4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Zekb84rtFtrZC48rT29n5a.jpg" mos="" align="middle" fullscreen="" width="135" height="355" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE]</strong> Another lowest ever price on Insta360 gear. OK, so the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x4-review-the-ultimate-360-camera" data-dimension112="ca611ff7-2f80-4192-a87b-b6b229ea7688" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="$299.99">Insta360 X4</a> isn't quite as formidable as the X5, but it's still an epic 360 camera that offers 8K 360 recording. And for under $300, this is as good as 360 cams get. I've not seen this camera drop as low as this before, and I doubt it'll drop much further this week, if at all.<a class="view-deal button" href="https://www.amazon.com/Insta360-Standard-Bundle-Waterproof-Stabilization/dp/B0DBQBMQH2" target="_blank" rel="nofollow" data-dimension112="ca611ff7-2f80-4192-a87b-b6b229ea7688" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="$299.99">View Deal</a></p></div><div class="product"><a data-dimension112="5d6d734a-c1b1-4c9f-a2e9-895333ad9713" data-action="Deal Block" data-label="Insta360 Ace Pro 2" data-dimension48="Insta360 Ace Pro 2" data-dimension25="$334.99" href="https://www.amazon.com/Insta360-Battery-Waterproof-Co-Engineered-Superior/dp/B0FLQ5PD6B" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:944px;"><p class="vanilla-image-block" style="padding-top:99.89%;"><img id="4dhhwV4RqKuuSRRijbFpeD" name="Insta360 Ace Pro 2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4dhhwV4RqKuuSRRijbFpeD.jpg" mos="" align="middle" fullscreen="" width="944" height="943" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-ace-pro-2-review" data-dimension112="5d6d734a-c1b1-4c9f-a2e9-895333ad9713" data-action="Deal Block" data-label="Insta360 Ace Pro 2" data-dimension48="Insta360 Ace Pro 2" data-dimension25="$334.99">Insta360 Ace Pro 2</a> is an extremely powerful action camera, capable of shooting in 8K at 30fps, giving editors lots of space to crop into frame while maintaining 4K exported footage. This is as low as I've seen this camera go, but it was overpriced to begin with. I'd hold off to see if it drops any further, but if it doesn't, I'd recommend picking up a GoPro Hero13 Black or DJI Osmo Action 5 Pro for less money.<a class="view-deal button" href="https://www.amazon.com/Insta360-Battery-Waterproof-Co-Engineered-Superior/dp/B0FLQ5PD6B" target="_blank" rel="nofollow" data-dimension112="5d6d734a-c1b1-4c9f-a2e9-895333ad9713" data-action="Deal Block" data-label="Insta360 Ace Pro 2" data-dimension48="Insta360 Ace Pro 2" data-dimension25="$334.99">View Deal</a></p></div><div class="product"><a data-dimension112="6e135526-83e7-4b93-a74c-2b1fcb7787a8" data-action="Deal Block" data-label="Insta360 Go 3S" data-dimension48="Insta360 Go 3S" data-dimension25="$299.99" href="https://www.amazon.com/Insta360-GO-Hands-Free-Stabilization-Waterproof/dp/B0D3WLV9Q1" 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:103.00%;"><img id="5QeWeWExaz96C2YFVEfUDD" name="02.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/5QeWeWExaz96C2YFVEfUDD.jpg" mos="" align="middle" fullscreen="" width="500" height="515" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-go-3s-review" data-dimension112="6e135526-83e7-4b93-a74c-2b1fcb7787a8" data-action="Deal Block" data-label="Insta360 Go 3S" data-dimension48="Insta360 Go 3S" data-dimension25="$299.99">Insta360 Go 3S</a> is a tiny camera offering the last word in versatility and 4K/30fps video. The GoPro LIT Hero is much cheaper still, even with this deal, but can't match the Go 3S's sheer tiny dimensions. I have a suspicion we may see this drop a little further, although this is already a pretty good deal and the lowest ever price on this camera (it was kinda overpriced to begin with though).<a class="view-deal button" href="https://www.amazon.com/Insta360-GO-Hands-Free-Stabilization-Waterproof/dp/B0D3WLV9Q1" target="_blank" rel="nofollow" data-dimension112="6e135526-83e7-4b93-a74c-2b1fcb7787a8" data-action="Deal Block" data-label="Insta360 Go 3S" data-dimension48="Insta360 Go 3S" data-dimension25="$299.99">View Deal</a></p></div><div class="product"><a data-dimension112="4240d80e-43fa-40b7-a4e7-ad6bb30ad331" data-action="Deal Block" data-label="Insta360 Go Ultra" data-dimension48="Insta360 Go Ultra" data-dimension25="$379.99" href="https://www.amazon.com/Insta360-Ultra-Standard-Bundle-Midnight/dp/B0FH22RB4S/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:645px;"><p class="vanilla-image-block" style="padding-top:133.02%;"><img id="gDfXrxsSMgGHyTQkLRYdBd" name="Insta360 Go Ultra" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gDfXrxsSMgGHyTQkLRYdBd.jpg" mos="" align="middle" fullscreen="" width="645" height="858" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Once again, an Insta360 product has hit its lowest ever price, although I'd hold out to see if this one goes lower. The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-go-ultra-review" data-dimension112="4240d80e-43fa-40b7-a4e7-ad6bb30ad331" data-action="Deal Block" data-label="Insta360 Go Ultra" data-dimension48="Insta360 Go Ultra" data-dimension25="$379.99">Insta360 Go Ultra</a> is the brand's ultimate tiny camera, but is borderline obscenely priced at MSRP. It shoots 4K/60fps, but unless this camera drops lower, I'd recommend the GoPro LIT Hero instead for 4K/60.<a class="view-deal button" href="https://www.amazon.com/Insta360-Ultra-Standard-Bundle-Midnight/dp/B0FH22RB4S/" target="_blank" rel="nofollow" data-dimension112="4240d80e-43fa-40b7-a4e7-ad6bb30ad331" data-action="Deal Block" data-label="Insta360 Go Ultra" data-dimension48="Insta360 Go Ultra" data-dimension25="$379.99">View Deal</a></p></div><h2 class="article-body__section" id="section-black-friday-action-camera-deals-accessories"><span>Black Friday action camera deals: Accessories</span></h2><div class="product"><a data-dimension112="28ba9181-e5e2-4bbb-8b0d-7fd68d491740" data-action="Deal Block" data-label="GoPro has slashed the price of its Premium subscription for Black Friday, so you can now get 12 months of its basic tier service for half price. This gets you unlimited storage for footage shot on GoPros, 50% off accessories, $100 off another GoPro (at subscription renewal) and guaranteed camera replacement if yours is damaged. Not bad. This is the typical discount price which we see at this time of year, and I doubt this product will be reduced further this week." data-dimension48="GoPro has slashed the price of its Premium subscription for Black Friday, so you can now get 12 months of its basic tier service for half price. This gets you unlimited storage for footage shot on GoPros, 50% off accessories, $100 off another GoPro (at subscription renewal) and guaranteed camera replacement if yours is damaged. Not bad. This is the typical discount price which we see at this time of year, and I doubt this product will be reduced further this week." data-dimension25="$24.99" href="https://gopro.com/en/us/shop/subscriptions" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1651px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="eCsTPCEzhwDdme2s7fD3un" name="GoPro Logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/eCsTPCEzhwDdme2s7fD3un.jpg" mos="" align="middle" fullscreen="" width="1651" height="1651" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>GoPro has slashed the price of its Premium subscription for Black Friday, so you can now get 12 months of its basic tier service for half price. This gets you unlimited storage for footage shot on GoPros, 50% off accessories, $100 off another GoPro (at subscription renewal) and guaranteed camera replacement if yours is damaged. Not bad. This is the typical discount price which we see at this time of year, and I doubt this product will be reduced further this week.<a class="view-deal button" href="https://gopro.com/en/us/shop/subscriptions" target="_blank" rel="nofollow" data-dimension112="28ba9181-e5e2-4bbb-8b0d-7fd68d491740" data-action="Deal Block" data-label="GoPro has slashed the price of its Premium subscription for Black Friday, so you can now get 12 months of its basic tier service for half price. This gets you unlimited storage for footage shot on GoPros, 50% off accessories, $100 off another GoPro (at subscription renewal) and guaranteed camera replacement if yours is damaged. Not bad. This is the typical discount price which we see at this time of year, and I doubt this product will be reduced further this week." data-dimension48="GoPro has slashed the price of its Premium subscription for Black Friday, so you can now get 12 months of its basic tier service for half price. This gets you unlimited storage for footage shot on GoPros, 50% off accessories, $100 off another GoPro (at subscription renewal) and guaranteed camera replacement if yours is damaged. Not bad. This is the typical discount price which we see at this time of year, and I doubt this product will be reduced further this week." data-dimension25="$24.99">View Deal</a></p></div><div class="product"><a data-dimension112="4d14bb6d-4506-4c9d-9f1c-f65e68ae03b4" data-action="Deal Block" data-label="[IDEAL FOR 360 VIDEO] If you're shooting 360-degree footage in 8K, you need a lot of storage. This 512GB SD is ideal, and is currently at its lowest ever price for Black Friday." data-dimension48="[IDEAL FOR 360 VIDEO] If you're shooting 360-degree footage in 8K, you need a lot of storage. This 512GB SD is ideal, and is currently at its lowest ever price for Black Friday." data-dimension25="$32.99" href="https://www.amazon.com/SAMSUNG-microSDXC-Nintendo-Switch-MB-ME512SA-AM/dp/B0CWPPMD8W" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:73.07%;"><img id="uUypNELSyfmS2C2xYSZBg" name="Samsung Evo Select microSD 512GB" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/uUypNELSyfmS2C2xYSZBg.jpg" mos="" align="middle" fullscreen="" width="1500" height="1096" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[IDEAL FOR 360 VIDEO] </strong>If you're shooting 360-degree footage in 8K, you need a lot of storage. This 512GB SD is ideal, and is currently at its lowest ever price for Black Friday.<a class="view-deal button" href="https://www.amazon.com/SAMSUNG-microSDXC-Nintendo-Switch-MB-ME512SA-AM/dp/B0CWPPMD8W" target="_blank" rel="nofollow" data-dimension112="4d14bb6d-4506-4c9d-9f1c-f65e68ae03b4" data-action="Deal Block" data-label="[IDEAL FOR 360 VIDEO] If you're shooting 360-degree footage in 8K, you need a lot of storage. This 512GB SD is ideal, and is currently at its lowest ever price for Black Friday." data-dimension48="[IDEAL FOR 360 VIDEO] If you're shooting 360-degree footage in 8K, you need a lot of storage. This 512GB SD is ideal, and is currently at its lowest ever price for Black Friday." data-dimension25="$32.99">View Deal</a></p></div><h2 class="article-body__section" id="section-black-friday-u-k-action-camera-deals"><span>Black Friday U.K. action camera deals</span></h2><div class="product"><a data-dimension112="c7fa4b33-fb37-4df1-8a56-51317eadc48a" data-action="Deal Block" data-label="[LOWEST PRICE] If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low £239. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around." data-dimension48="[LOWEST PRICE] If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low £239. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around." data-dimension25="£239" href="https://www.amazon.co.uk/dp/B0DS2DF5S5" 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:84.00%;"><img id="ZjbfZ45E3afFQJCzAjxoiM" name="DJI OA5P QUICK LIST" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZjbfZ45E3afFQJCzAjxoiM.jpg" mos="" align="middle" fullscreen="" width="500" height="420" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE]</strong> If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low £239. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around.<a class="view-deal button" href="https://www.amazon.co.uk/dp/B0DS2DF5S5" target="_blank" rel="nofollow" data-dimension112="c7fa4b33-fb37-4df1-8a56-51317eadc48a" data-action="Deal Block" data-label="[LOWEST PRICE] If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low £239. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around." data-dimension48="[LOWEST PRICE] If you're only going to snap up one action camera deal over Black Friday, make it this one! The Osmo Action 5 Pro has dropped to an incredibly low £239. That's the cheapest I've ever seen. What's more, this is the Essential Combo, so comes with some handy accessories over the base combo. Get this deal while you can because I don't expect it to stick around." data-dimension25="£239">View Deal</a></p></div><div class="product"><a data-dimension112="6df37c55-5fa2-495d-9729-57480af24ffe" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="£296" href="https://www.amazon.co.uk/DJI-Standard-Imaging-Recording-Waterproof/dp/B0DTTZZ6Q3" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1090px;"><p class="vanilla-image-block" style="padding-top:137.61%;"><img id="yUXRL4qFis7QUzehxiNGTN" name="DJI Osmo 360" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yUXRL4qFis7QUzehxiNGTN.jpg" mos="" align="middle" fullscreen="" width="1090" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE] </strong>Honestly, I wasn't expecting such a huge deal on this camera given it only launched a few months back. The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review" data-dimension112="6df37c55-5fa2-495d-9729-57480af24ffe" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="£296">DJI Osmo 360</a> is currently nearly $200 off, which makes this serious Insta360 X5 and GoPro MAX2 competitor a massive steal. It shoots lovely 8K 360 footage and offers seamless integration with other products in DJI's ecosystem. Given this is the cheapest price ever for this camera, I doubt it'll go much lower, even on Black Friday itself. I'd advise buying this camera now.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Standard-Imaging-Recording-Waterproof/dp/B0DTTZZ6Q3" target="_blank" rel="nofollow" data-dimension112="6df37c55-5fa2-495d-9729-57480af24ffe" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="£296">View Deal</a></p></div><div class="product"><a data-dimension112="679f5dff-8aa8-44d5-9dc7-25b33c14ae60" data-action="Deal Block" data-label="DJI Osmo Pocket 3" data-dimension48="DJI Osmo Pocket 3" data-dimension25="£389" href="https://www.amazon.co.uk/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:425px;"><p class="vanilla-image-block" style="padding-top:252.00%;"><img id="A42QpbMsUGy822dgTrzqi6" name="DJI Osmo Pocket 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/A42QpbMsUGy822dgTrzqi6.jpg" mos="" align="middle" fullscreen="" width="425" height="1071" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I absolutely adored the <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3" data-dimension112="679f5dff-8aa8-44d5-9dc7-25b33c14ae60" data-action="Deal Block" data-label="DJI Osmo Pocket 3" data-dimension48="DJI Osmo Pocket 3" data-dimension25="£389">DJI Osmo Pocket 3</a> when I reviewed it in late 2023. And it still holds up very well two years later. In fact, we often use the Pocket 3 to shoot social content behind the scenes! This is a perfect tool for new and experience vloggers and content creators who want a pocketable tool that can produce beautiful-looking and professionally stabilized footage. This is the cheapest this camera has ever been, so I don't see it dropping any further.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD" target="_blank" rel="nofollow" data-dimension112="679f5dff-8aa8-44d5-9dc7-25b33c14ae60" data-action="Deal Block" data-label="DJI Osmo Pocket 3" data-dimension48="DJI Osmo Pocket 3" data-dimension25="£389">View Deal</a></p></div><div class="product"><a data-dimension112="4c9ac7ec-0b96-49ae-b886-e10ba3012cca" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="£269" href="https://www.amazon.co.uk/GoPro-HERO13-Black-Forest-Limited/dp/B0F8PHLFX1/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:795px;"><p class="vanilla-image-block" style="padding-top:90.94%;"><img id="XYV7jNhKVi79crhdhRF2gn" name="GoPro H13B Forest Green" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XYV7jNhKVi79crhdhRF2gn.jpg" mos="" align="middle" fullscreen="" width="795" height="723" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The GoPro Hero13 Black is GoPro's current flagship action camera. It shoots 5.3K/60fps and is waterproof to 33 feet. Its range of pro features earned it a 4.5* score in my <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-hero13-black-can-the-champ-keep-his-title" data-dimension112="4c9ac7ec-0b96-49ae-b886-e10ba3012cca" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="£269">GoPro Hero13 Black review</a>. I've seen this camera drop to as low as £252, so while this is a good deal, it could be worth holding off a little to see if this drops further over the week.<a class="view-deal button" href="https://www.amazon.co.uk/GoPro-HERO13-Black-Forest-Limited/dp/B0F8PHLFX1/" target="_blank" rel="nofollow" data-dimension112="4c9ac7ec-0b96-49ae-b886-e10ba3012cca" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="£269">View Deal</a></p></div><div class="product"><a data-dimension112="aa0420c3-8cd3-4a2a-8b36-dcb781579020" data-action="Deal Block" data-label="[LATEST MODEL] This GoPro was only launched a few weeks back, so it's great to see it already at a discount. By default, this is its lowest price! It's an updated version of the original Hero (2024), with a built-in front light and some upgraded features. I'm actually midway through testing this camera right now. It offers 4K/60fps as opposed to the 4K/30fps of the original Hero, making it better for fast-paced action content. Yet it's just as tiny, so can be mounted anywhere! Given how new it is, I don't expect this camera to drop much further." data-dimension48="[LATEST MODEL] This GoPro was only launched a few weeks back, so it's great to see it already at a discount. By default, this is its lowest price! It's an updated version of the original Hero (2024), with a built-in front light and some upgraded features. I'm actually midway through testing this camera right now. It offers 4K/60fps as opposed to the 4K/30fps of the original Hero, making it better for fast-paced action content. Yet it's just as tiny, so can be mounted anywhere! Given how new it is, I don't expect this camera to drop much further." data-dimension25="£217" href="https://www.amazon.co.uk/GoPro-LIT-HERO-Built-Stabilization/dp/B0FRCKLY9N/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:516px;"><p class="vanilla-image-block" style="padding-top:87.21%;"><img id="93EVBRECFmu7EF4k2shAdN" name="GoPro LIT Hero" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/93EVBRECFmu7EF4k2shAdN.jpg" mos="" align="middle" fullscreen="" width="516" height="450" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LATEST MODEL] </strong>This GoPro was only launched a few weeks back, so it's great to see it already at a discount. By default, this is its lowest price! It's an updated version of the original Hero (2024), with a built-in front light and some upgraded features. I'm actually midway through testing this camera right now. It offers 4K/60fps as opposed to the 4K/30fps of the original Hero, making it better for fast-paced action content. Yet it's just as tiny, so can be mounted anywhere! Given how new it is, I don't expect this camera to drop much further.<a class="view-deal button" href="https://www.amazon.co.uk/GoPro-LIT-HERO-Built-Stabilization/dp/B0FRCKLY9N/" target="_blank" rel="nofollow" data-dimension112="aa0420c3-8cd3-4a2a-8b36-dcb781579020" data-action="Deal Block" data-label="[LATEST MODEL] This GoPro was only launched a few weeks back, so it's great to see it already at a discount. By default, this is its lowest price! It's an updated version of the original Hero (2024), with a built-in front light and some upgraded features. I'm actually midway through testing this camera right now. It offers 4K/60fps as opposed to the 4K/30fps of the original Hero, making it better for fast-paced action content. Yet it's just as tiny, so can be mounted anywhere! Given how new it is, I don't expect this camera to drop much further." data-dimension48="[LATEST MODEL] This GoPro was only launched a few weeks back, so it's great to see it already at a discount. By default, this is its lowest price! It's an updated version of the original Hero (2024), with a built-in front light and some upgraded features. I'm actually midway through testing this camera right now. It offers 4K/60fps as opposed to the 4K/30fps of the original Hero, making it better for fast-paced action content. Yet it's just as tiny, so can be mounted anywhere! Given how new it is, I don't expect this camera to drop much further." data-dimension25="£217">View Deal</a></p></div><div class="product"><a data-dimension112="b607a9f7-7655-4212-94f3-90eec890cd5a" data-action="Deal Block" data-label="[LATEST MODEL] What. A. Camera. In my GoPro MAX2 review, this camera earned 4.5* and a spot on my top 360 cameras guide as "best for pros", because it is. Its pro features like "true" 8K, Log recording and GoPro labs custom firmware make it ideal for serious content creators. This is another camera launched only weeks back, making this the lowest price ever! I doubt it'll drop lower than this given how new it is, so you can buy in confidence now." data-dimension48="[LATEST MODEL] What. A. Camera. In my GoPro MAX2 review, this camera earned 4.5* and a spot on my top 360 cameras guide as "best for pros", because it is. Its pro features like "true" 8K, Log recording and GoPro labs custom firmware make it ideal for serious content creators. This is another camera launched only weeks back, making this the lowest price ever! I doubt it'll drop lower than this given how new it is, so you can buy in confidence now." data-dimension25="£349" href="https://www.amazon.co.uk/GoPro-MAX2-Traditional-Replaceable-Stabilization/dp/B0FP5SVBHK" 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="orEaFwQNVYzWXYkZWDdp7o" name="GRID GoPro MAX2" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/orEaFwQNVYzWXYkZWDdp7o.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LATEST MODEL]</strong> What. A. Camera. In my GoPro MAX2 review, this camera earned 4.5* and a spot on my top 360 cameras guide as "best for pros", because it is. Its pro features like "true" 8K, Log recording and GoPro labs custom firmware make it ideal for serious content creators. This is another camera launched only weeks back, making this the lowest price ever! I doubt it'll drop lower than this given how new it is, so you can buy in confidence now.<a class="view-deal button" href="https://www.amazon.co.uk/GoPro-MAX2-Traditional-Replaceable-Stabilization/dp/B0FP5SVBHK" target="_blank" rel="nofollow" data-dimension112="b607a9f7-7655-4212-94f3-90eec890cd5a" data-action="Deal Block" data-label="[LATEST MODEL] What. A. Camera. In my GoPro MAX2 review, this camera earned 4.5* and a spot on my top 360 cameras guide as "best for pros", because it is. Its pro features like "true" 8K, Log recording and GoPro labs custom firmware make it ideal for serious content creators. This is another camera launched only weeks back, making this the lowest price ever! I doubt it'll drop lower than this given how new it is, so you can buy in confidence now." data-dimension48="[LATEST MODEL] What. A. Camera. In my GoPro MAX2 review, this camera earned 4.5* and a spot on my top 360 cameras guide as "best for pros", because it is. Its pro features like "true" 8K, Log recording and GoPro labs custom firmware make it ideal for serious content creators. This is another camera launched only weeks back, making this the lowest price ever! I doubt it'll drop lower than this given how new it is, so you can buy in confidence now." data-dimension25="£349">View Deal</a></p></div><div class="product"><a data-dimension112="af035b82-91b1-4631-8564-a4c97677572e" data-action="Deal Block" data-label="GoPro Hero (2024)" data-dimension48="GoPro Hero (2024)" data-dimension25="£168.47" href="https://www.amazon.co.uk/GoPro-HERO-Compact-Waterproof-Action/dp/B0DCQYSM7W/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1229px;"><p class="vanilla-image-block" style="padding-top:117.66%;"><img id="HZVZimgZUmwFPaXVtKC26V" name="GoPro Hero (2024)" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/HZVZimgZUmwFPaXVtKC26V.jpg" mos="" align="middle" fullscreen="" width="1229" height="1446" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The tiny <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-hero-2024-review" data-dimension112="af035b82-91b1-4631-8564-a4c97677572e" data-action="Deal Block" data-label="GoPro Hero (2024)" data-dimension48="GoPro Hero (2024)" data-dimension25="£168.47">GoPro Hero (2024)</a> was GoPro's smallest action camera when it launched (and is now the joint smallest after the LIT Hero release this year). It shoots 4K/30fps video and boasts strong battery life. This camera dropped to £167 earlier in the year, so hey, this is pretty much as cheap as the Hero gets!<a class="view-deal button" href="https://www.amazon.co.uk/GoPro-HERO-Compact-Waterproof-Action/dp/B0DCQYSM7W/" target="_blank" rel="nofollow" data-dimension112="af035b82-91b1-4631-8564-a4c97677572e" data-action="Deal Block" data-label="GoPro Hero (2024)" data-dimension48="GoPro Hero (2024)" data-dimension25="£168.47">View Deal</a></p></div><div class="product"><a data-dimension112="93e59bba-1833-4e27-81cd-4ada02f8bac9" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="£409.99" href="https://www.amazon.co.uk/Insta360-Waterproof-Replaceable-Built-Stabilization/dp/B0FJR5T2Z9" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:470px;"><p class="vanilla-image-block" style="padding-top:265.11%;"><img id="gMQjPJxNV7GyCXG237fANQ" name="Insta360 X5" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/gMQjPJxNV7GyCXG237fANQ.jpg" mos="" align="middle" fullscreen="" width="470" height="1246" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE]</strong> Another huge deal, this time on my top 360 camera, the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x5-review" data-dimension112="93e59bba-1833-4e27-81cd-4ada02f8bac9" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="£409.99">Insta360 X5</a>. This is the best 360 camera for most people thanks to its combination of fantastic image quality, excellent audio, its easy to use app and editing software, and its straight-to-social workflow ethos. It's pricey, sure, but it's the best 360 camera on the market, and is now cheaper than ever. I don't see this camera dropping much further this week, so now is a great time to buy.<a class="view-deal button" href="https://www.amazon.co.uk/Insta360-Waterproof-Replaceable-Built-Stabilization/dp/B0FJR5T2Z9" target="_blank" rel="nofollow" data-dimension112="93e59bba-1833-4e27-81cd-4ada02f8bac9" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="£409.99">View Deal</a></p></div><div class="product"><a data-dimension112="d13cd189-619c-4eb1-8293-cf069c3d5948" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="£309.99" href="https://www.amazon.co.uk/Insta360-Standard-Bundle-Waterproof-Invisible/dp/B0DBQBMQH2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:135px;"><p class="vanilla-image-block" style="padding-top:262.96%;"><img id="Zekb84rtFtrZC48rT29n5a" name="Insta360 X4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Zekb84rtFtrZC48rT29n5a.jpg" mos="" align="middle" fullscreen="" width="135" height="355" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>[LOWEST PRICE]</strong> Another lowest ever price on Insta360 gear. OK, so the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x4-review-the-ultimate-360-camera" data-dimension112="d13cd189-619c-4eb1-8293-cf069c3d5948" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="£309.99">Insta360 X4</a> isn't quite as formidable as the X5, but it's still an epic 360 camera that offers 8K 360 recording. And for under $300, this is as good as 360 cams get. I've not seen this camera drop as low as this before, and I doubt it'll drop much further this week, if at all.<a class="view-deal button" href="https://www.amazon.co.uk/Insta360-Standard-Bundle-Waterproof-Invisible/dp/B0DBQBMQH2" target="_blank" rel="nofollow" data-dimension112="d13cd189-619c-4eb1-8293-cf069c3d5948" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="£309.99">View Deal</a></p></div><h2 class="article-body__section" id="section-shop-today-s-best-black-friday-deals"><span>Shop today's best Black Friday deals</span></h2><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, Under Armour and more</strong></a><strong></strong></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia and more</strong></a><strong></strong></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $249</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + 66% off bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster laptop deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Nike: </strong><a href="https://www.nike.com/w/sale-3yaep?sortBy=priceAsc" target="_blank" rel="nofollow"><strong>apparel/sneakers from $7</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’m vetting the best Black Friday drone deals — save big on DJI, HoverAir, Potensic and more ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/black-friday-drone-deals-2025-save-on-dji-hoverair-potensic-more</link>
                                                                            <description>
                            <![CDATA[ Whether you're buying a drone for the first time or you're a seasoned pilot, you can save big on the best DJI, Potensic and HoverAir quadcopters now! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">oJioNVsJ7dkQCBCxJ6jZ4F</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/K33aCZFFpsxsNpvrys5HRn-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 24 Nov 2025 12:07:02 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/K33aCZFFpsxsNpvrys5HRn-1280-80.jpg">
                                                            <media:credit><![CDATA[DJI / HoverAir / Potensic / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of DJI, HoverAir and Potensic drones]]></media:description>                                                            <media:text><![CDATA[A selection of DJI, HoverAir and Potensic drones]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of DJI, HoverAir and Potensic drones]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/K33aCZFFpsxsNpvrys5HRn-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p><a href="http://tomsguide.com/live/news/black-friday-deals-ultimate-guide-my-top-picks-2025">Black Friday</a> is almost upon us, and even though it's only the first day of the week, we've already seen some killer discounts on our favorite tech. Whether you've been saving up for a <a href="https://www.tomsguide.com/live/news/black-friday-tv-deals-live-best-early-sales-on-qleds-mini-leds-and-oleds-starting-from-usd69">TV</a>, <a href="https://www.tomsguide.com/live/news/black-friday-laptop-deals">laptop</a>, gaming console or a camera, there are many great discounts to be had. And if, like me, you love aerial photography and are looking for a drone to buy, there's no better time than this week.</p><p>The <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> enable you to take to the skies and capture the world from a bird's point of view. I test and review these nifty quadcopters for a living, so I'll be keeping you posted on the best Black Friday drone deals all week. If you want an easy-to-use selfie drone, the <a href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTC2HF8/" target="_blank" rel="nofollow">HoverAir X1 ProMax is currently 28% off at Amazon</a>, and the bundle includes a bunch of goodies for a smooth flying experience.</p><p>For those wanting a drone that captures stunning images while being extremely safe to fly, the <a href="https://www.amazon.com/DJI-6941565994004-Drone-RC/dp/B07FTJ8RXY/" target="_blank" rel="nofollow">DJI Flip with the RC-2 controller is down to just $509 at Amazon</a>. It's my pick for the best drone for beginners, so I can't recommend this deal enough. And while the Flip isn't discounted in the U.K., the <a href="https://www.amazon.co.uk/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FVYPT22/" target="_blank" rel="nofollow">DJI Neo Motion Fly More Combo is available for just £378</a>, and it's a wonderful small drone for first-time buyers and FPV enthusiasts.</p><p>And there's more where that came from. I've handpicked my favorite deals below, and I'll keep an eye on the sales and add any more discounts that pop up. For more deals, don't forget to tune into our <a href="https://www.tomsguide.com/live/news/black-friday-deals-ultimate-guide-my-top-picks-2025">Black Friday deals live blog</a>!</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong></strong><a href="https://www.amazon.com/blackfriday" target="_blank" rel="nofollow"><strong>See all Amazon Black Friday deals right now!</strong></a><strong></strong></li><li><strong>HoverAir X1 ProMax Cycling Combo: </strong><a href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTC2HF8/" target="_blank" rel="nofollow"><strong>was $1,292 now $929</strong></a><strong></strong></li><li><strong>Potensic Atom SE: </strong><a href="https://www.amazon.com/Potensic-Transmission-Brushless-Parallel-Charging/dp/B0CBLQDJ98/" target="_blank" rel="nofollow"><strong>was $359 now $259</strong></a><strong></strong></li><li><strong>Potensic Atom: </strong><a href="https://www.amazon.com/Potensic-Transmission-QuickShots-Lightweight-Beginners/dp/B0CFLGVKZ1/" target="_blank" rel="nofollow"><strong>was $299 now $229</strong></a><strong></strong></li><li><strong>Potensic Atom 2: </strong><a href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow"><strong>was $479 now $399</strong></a><strong></strong></li><li><strong>DJI Neo: </strong><a href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B0DDS1368S/" target="_blank" rel="nofollow"><strong>was $199 now $159</strong></a><strong></strong></li><li><strong>DJI Flip: </strong><a href="https://www.amazon.com/DJI-6941565994004-Drone-RC/dp/B07FTJ8RXY/" target="_blank" rel="nofollow"><strong>was $639 now $509</strong></a><strong></strong></li><li><strong>DJI Mini 4K: </strong><a href="https://www.amazon.com/DJI-Stabilization-Transmission-Resistance-Battery/dp/B0CXJDDJ9X/" target="_blank" rel="nofollow"><strong>was $299 now $239</strong></a></li><li><strong>DJI Neo Motion Fly More Combo: </strong><a href="https://www.amazon.co.uk/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FVYPT22/" target="_blank" rel="nofollow"><strong>was £449 now £378</strong></a></li><li><strong>DJI Mini 4 Pro: </strong><a href="https://www.amazon.co.uk/DJI-Mini-Drone-Transmission-Distance-Omnidirectional/dp/B0CFF38HMJ/" target="_blank" rel="nofollow"><strong>was £689 now £519</strong></a></li><li><strong>DJI Avata 2: </strong><a href="https://www.amazon.co.uk/DJI-Immersive-Experience-Super-Wide-Compatible/dp/B0CS6KY96F/" target="_blank" rel="nofollow"><strong>was £429 now £359</strong></a></li></ul><h2 class="article-body__section" id="section-best-black-friday-u-s-drone-deals"><span>Best Black Friday U.S. drone deals</span></h2><div class="product"><a data-dimension112="e6cda49b-b8d3-4779-95b0-2b463d7ae98c" data-action="Deal Block" data-label="The HoverAir X1 ProMax is the premium model in the X1 lineup, capable of capturing 8K/30fps and 4K/60fps video. It comes with 64GB of internal storage so you can keep recording without worrying about running out of space. This bundle includes the Joystick and Beacon which, when combined, act as a regular controller, giving you more control over the drone." data-dimension48="The HoverAir X1 ProMax is the premium model in the X1 lineup, capable of capturing 8K/30fps and 4K/60fps video. It comes with 64GB of internal storage so you can keep recording without worrying about running out of space. This bundle includes the Joystick and Beacon which, when combined, act as a regular controller, giving you more control over the drone." data-dimension25="$929" href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTC2HF8/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1464px;"><p class="vanilla-image-block" style="padding-top:96.38%;"><img id="QYg3PXu279MAyaj5gKjrj" name="HoverAir-X1-ProMax-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QYg3PXu279MAyaj5gKjrj.jpg" mos="" align="middle" fullscreen="" width="1464" height="1411" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The HoverAir X1 ProMax is the premium model in the X1 lineup, capable of capturing 8K/30fps and 4K/60fps video. It comes with 64GB of internal storage so you can keep recording without worrying about running out of space. This bundle includes the Joystick and Beacon which, when combined, act as a regular controller, giving you more control over the drone.<a class="view-deal button" href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTC2HF8/" target="_blank" rel="nofollow" data-dimension112="e6cda49b-b8d3-4779-95b0-2b463d7ae98c" data-action="Deal Block" data-label="The HoverAir X1 ProMax is the premium model in the X1 lineup, capable of capturing 8K/30fps and 4K/60fps video. It comes with 64GB of internal storage so you can keep recording without worrying about running out of space. This bundle includes the Joystick and Beacon which, when combined, act as a regular controller, giving you more control over the drone." data-dimension48="The HoverAir X1 ProMax is the premium model in the X1 lineup, capable of capturing 8K/30fps and 4K/60fps video. It comes with 64GB of internal storage so you can keep recording without worrying about running out of space. This bundle includes the Joystick and Beacon which, when combined, act as a regular controller, giving you more control over the drone." data-dimension25="$929">View Deal</a></p></div><div class="product"><a data-dimension112="6410cbc6-49cb-4ba2-b025-4f1f7bdde61d" data-action="Deal Block" data-label="The Potensic Atom SE Fly More Combo includes the drone, a charging hub with three batteries, the controller, a carry bag and other goodies. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots." data-dimension48="The Potensic Atom SE Fly More Combo includes the drone, a charging hub with three batteries, the controller, a carry bag and other goodies. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots." data-dimension25="$259" href="https://www.amazon.com/Potensic-Transmission-Brushless-Parallel-Charging/dp/B0CBLQDJ98/" 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:83.40%;"><img id="oJR3PkpX5VqTBHx9Xa6hn8" name="Potensic-Atom-SE-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oJR3PkpX5VqTBHx9Xa6hn8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1251" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Potensic Atom SE Fly More Combo includes the drone, a charging hub with three batteries, the controller, a carry bag and other goodies. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots.<a class="view-deal button" href="https://www.amazon.com/Potensic-Transmission-Brushless-Parallel-Charging/dp/B0CBLQDJ98/" target="_blank" rel="nofollow" data-dimension112="6410cbc6-49cb-4ba2-b025-4f1f7bdde61d" data-action="Deal Block" data-label="The Potensic Atom SE Fly More Combo includes the drone, a charging hub with three batteries, the controller, a carry bag and other goodies. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots." data-dimension48="The Potensic Atom SE Fly More Combo includes the drone, a charging hub with three batteries, the controller, a carry bag and other goodies. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots." data-dimension25="$259">View Deal</a></p></div><div class="product"><a data-dimension112="abcbf9b2-5022-4214-bff8-db05c6fc655b" data-action="Deal Block" data-label="Atom review" data-dimension48="Atom review" data-dimension25="$229" href="https://www.amazon.com/Potensic-Transmission-QuickShots-Lightweight-Beginners/dp/B0CFLGVKZ1/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1500px;"><p class="vanilla-image-block" style="padding-top:82.87%;"><img id="Zd79dzwsBEgXebEXd8ien8" name="Potensic-Atom-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Zd79dzwsBEgXebEXd8ien8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1243" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Potensic Atom is a fantastic alternative to DJI. In my <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-review" data-dimension112="abcbf9b2-5022-4214-bff8-db05c6fc655b" data-action="Deal Block" data-label="Atom review" data-dimension48="Atom review" data-dimension25="$229">Atom review</a>, I noted that this drone is straightforward to fly, whether using the controller or not. It offers 4K/30fps recording in a compact and lightweight body, and also captures detailed still images.<a class="view-deal button" href="https://www.amazon.com/Potensic-Transmission-QuickShots-Lightweight-Beginners/dp/B0CFLGVKZ1/" target="_blank" rel="nofollow" data-dimension112="abcbf9b2-5022-4214-bff8-db05c6fc655b" data-action="Deal Block" data-label="Atom review" data-dimension48="Atom review" data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="72ce6375-a641-42c0-8a16-dd63e61ca205" data-action="Deal Block" data-label="my review" data-dimension48="my review" data-dimension25="$399" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" 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:78.13%;"><img id="QEqNG4iNnxL2KBjVQKhum8" name="Potensic-Atom-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QEqNG4iNnxL2KBjVQKhum8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1172" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Potensic Atom 2 is <em>even better </em>than its predecessor, as it can capture 48MP stills. In <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review" data-dimension112="72ce6375-a641-42c0-8a16-dd63e61ca205" data-action="Deal Block" data-label="my review" data-dimension48="my review" data-dimension25="$399">my review</a>, I noted that it records stable, smooth 4K/30fps video and features advanced, accurate AI subject tracking, along with a new, easy-to-use controller and app. It’s also lightweight yet sturdy. This deal includes extra batteries and a carry bag.<a class="view-deal button" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow" data-dimension112="72ce6375-a641-42c0-8a16-dd63e61ca205" data-action="Deal Block" data-label="my review" data-dimension48="my review" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="d230c1e5-52e6-4012-99a1-95ec9cd8d091" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159" href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B07FTPX71F/" 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="yQ2D9952vwuZALYFFAiFF6" name="Neo-dealbox" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yQ2D9952vwuZALYFFAiFF6.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Even though it has now been succeeded by the DJI Neo 2, the Neo is still a beautiful little drone. In my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review" data-dimension112="d230c1e5-52e6-4012-99a1-95ec9cd8d091" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159">DJI Neo review,</a> I praised this drone for its lightweight, compact and minimalistic design. It can shoot 4K footage at 30fps, take detailed stills, and remain stable in tricky conditions. Easy to control with the RC-N3 controller or the DJI Fly app on a smartphone, the Neo makes drone photography more accessible thanks to its low price point.<a class="view-deal button" href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow" data-dimension112="d230c1e5-52e6-4012-99a1-95ec9cd8d091" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="9f9377ce-4691-46d3-a6c0-685a4900ff2d" data-action="Deal Block" data-label="DJI Flip review" data-dimension48="DJI Flip review" data-dimension25="$509" href="https://www.amazon.com/DJI-6941565994004-Drone-RC/dp/B07FTJ8RXY/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:799px;"><p class="vanilla-image-block" style="padding-top:76.47%;"><img id="GzxQt2zMfrvMGsjJXS9ZdL" name="DJI-Flip-dealbox" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/GzxQt2zMfrvMGsjJXS9ZdL.png" mos="" align="middle" fullscreen="" width="799" height="611" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It isn't everyday that the DJI Flip receives a killer discount so I'd grab this deal right away if I were you. In my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review" data-dimension112="9f9377ce-4691-46d3-a6c0-685a4900ff2d" data-action="Deal Block" data-label="DJI Flip review" data-dimension48="DJI Flip review" data-dimension25="$509">DJI Flip review</a>, I noted that this drone was perfect for beginners or those looking to upgrade from older DJI models. The Flip captures detailed 48MP stills in all lighting conditions, and records gorgeous 4K/60fps footage. It’s great for content creators as it features many shooting modes, plus it’s built really well and sports a slick design — a little like a droid from Star Wars! The Flip is, in my opinion, the best drone for beginners.<a class="view-deal button" href="https://www.amazon.com/DJI-6941565994004-Drone-RC/dp/B07FTJ8RXY/" target="_blank" rel="nofollow" data-dimension112="9f9377ce-4691-46d3-a6c0-685a4900ff2d" data-action="Deal Block" data-label="DJI Flip review" data-dimension48="DJI Flip review" data-dimension25="$509">View Deal</a></p></div><div class="product"><a data-dimension112="e521196e-8062-4cea-b70a-951d34a406f1" data-action="Deal Block" data-label="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension48="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension25="$239" href="https://www.amazon.com/DJI-Stabilization-Transmission-Resistance-Battery/dp/B0CXJDDJ9X/" 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:92.20%;"><img id="PgvNvPxsvHpkPD86QX6xFj" name="DJI-Mini-4K-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PgvNvPxsvHpkPD86QX6xFj.jpg" mos="" align="middle" fullscreen="" width="1500" height="1383" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-Transmission-Resistance-Battery/dp/B0CXJDDJ9X/" target="_blank" rel="nofollow" data-dimension112="e521196e-8062-4cea-b70a-951d34a406f1" data-action="Deal Block" data-label="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension48="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts." data-dimension25="$239">View Deal</a></p></div><h2 class="article-body__section" id="section-best-black-friday-u-k-drone-deals"><span>Best Black Friday U.K. drone deals</span></h2><div class="product"><a data-dimension112="afb1a65f-0bbb-4817-b101-1e6504506c1c" data-action="Deal Block" data-label="DJI Goggles N3 and the DJI RC Motion 2" data-dimension48="DJI Goggles N3 and the DJI RC Motion 2" data-dimension25="£378" href="https://www.amazon.co.uk/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FVYPT22/" 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:49.00%;"><img id="88oHzcVMQAzvjmsM7YdqP5" name="DJI Neo Motion-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/88oHzcVMQAzvjmsM7YdqP5.jpg" mos="" align="middle" fullscreen="" width="1500" height="735" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal includes the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-goggles-n3-review" data-dimension112="afb1a65f-0bbb-4817-b101-1e6504506c1c" data-action="Deal Block" data-label="DJI Goggles N3 and the DJI RC Motion 2" data-dimension48="DJI Goggles N3 and the DJI RC Motion 2" data-dimension25="£378">DJI Goggles N3 and the DJI RC Motion 2</a> controller, and it's great for anyone wanting to get into FPV flying. The Goggles N3 are the company’s cheapest, most beginner-friendly FPV glasses. Built exceptionally well with fantastic weight distribution, this FPV headset is extremely comfortable to wear and boasts long battery life. Delivering a crisp live feed, pair it with one of two motion controllers to fly with more confidence and turn either your Neo or Avata 2 into the ultimate budget FPV machine.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FVYPT22/" target="_blank" rel="nofollow" data-dimension112="afb1a65f-0bbb-4817-b101-1e6504506c1c" data-action="Deal Block" data-label="DJI Goggles N3 and the DJI RC Motion 2" data-dimension48="DJI Goggles N3 and the DJI RC Motion 2" data-dimension25="£378">View Deal</a></p></div><div class="product"><a data-dimension112="0745fc1c-42f4-4a05-9c62-6b9ad8166480" data-action="Deal Block" data-label="DJI Mini 4 Pro" data-dimension48="DJI Mini 4 Pro" data-dimension25="£539" href="https://www.amazon.co.uk/DJI-Mini-Drone-Transmission-Distance-Omnidirectional/dp/B0CFF38HMJ/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="Qowi28KtYcuuB8fFnZkEwj" name="DJI Mini 4 Pro.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Qowi28KtYcuuB8fFnZkEwj.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>While the latest DJI Mini 5 Pro hasn't received a Black Friday discount (yet), its still-formidable predecessor is down to a low price. The <a href="https://www.tomsguide.com/reviews/5-things-i-like-about-the-dji-mini-4-pro-and-2-things-i-hate" data-dimension112="0745fc1c-42f4-4a05-9c62-6b9ad8166480" data-action="Deal Block" data-label="DJI Mini 4 Pro" data-dimension48="DJI Mini 4 Pro" data-dimension25="£539">DJI Mini 4 Pro</a> delivers a robust package that caters to beginners and experienced flyers. What makes it outstanding is its low-light performance, and ability to produce usable footage without the noise and grain that other mini drones deliver.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Mini-Drone-Transmission-Distance-Omnidirectional/dp/B0CFF38HMJ/" target="_blank" rel="nofollow" data-dimension112="0745fc1c-42f4-4a05-9c62-6b9ad8166480" data-action="Deal Block" data-label="DJI Mini 4 Pro" data-dimension48="DJI Mini 4 Pro" data-dimension25="£539">View Deal</a></p></div><div class="product"><a data-dimension112="8d4b0d24-c4b0-4237-829c-c2edd27f2294" data-action="Deal Block" data-label="This deal is for FPV enthusiasts who want an easy-to-navigate drone that can get into tight spaces. The DJI Avata 2 is a robust, sturdy drone with propeller guards to protect it when flying close to other objects. It offers greater creative control over how the drone flies which unlocks unique perspectives and dynamic angles that traditional drones can’t achieve." data-dimension48="This deal is for FPV enthusiasts who want an easy-to-navigate drone that can get into tight spaces. The DJI Avata 2 is a robust, sturdy drone with propeller guards to protect it when flying close to other objects. It offers greater creative control over how the drone flies which unlocks unique perspectives and dynamic angles that traditional drones can’t achieve." data-dimension25="£359" href="https://www.amazon.co.uk/DJI-Immersive-Experience-Super-Wide-Compatible/dp/B0CS6KY96F/" 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:44.33%;"><img id="nCSBPbVuEhAjEdBD2kiChm" name="Avata-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/nCSBPbVuEhAjEdBD2kiChm.jpg" mos="" align="middle" fullscreen="" width="1500" height="665" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>This deal is for FPV enthusiasts who want an easy-to-navigate drone that can get into tight spaces. The DJI Avata 2 is a robust, sturdy drone with propeller guards to protect it when flying close to other objects. It offers greater creative control over how the drone flies which unlocks unique perspectives and dynamic angles that traditional drones can’t achieve. <a class="view-deal button" href="https://www.amazon.co.uk/DJI-Immersive-Experience-Super-Wide-Compatible/dp/B0CS6KY96F/" target="_blank" rel="nofollow" data-dimension112="8d4b0d24-c4b0-4237-829c-c2edd27f2294" data-action="Deal Block" data-label="This deal is for FPV enthusiasts who want an easy-to-navigate drone that can get into tight spaces. The DJI Avata 2 is a robust, sturdy drone with propeller guards to protect it when flying close to other objects. It offers greater creative control over how the drone flies which unlocks unique perspectives and dynamic angles that traditional drones can’t achieve." data-dimension48="This deal is for FPV enthusiasts who want an easy-to-navigate drone that can get into tight spaces. The DJI Avata 2 is a robust, sturdy drone with propeller guards to protect it when flying close to other objects. It offers greater creative control over how the drone flies which unlocks unique perspectives and dynamic angles that traditional drones can’t achieve." data-dimension25="£359">View Deal</a></p></div><h2 class="article-body__section" id="section-shop-today-s-best-black-friday-deals"><span>Shop today's best Black Friday deals</span></h2><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, Under Armour and more</strong></a><strong></strong></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia and more</strong></a><strong></strong></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $249</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + 66% off bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster laptop deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Nike: </strong><a href="https://www.nike.com/w/sale-3yaep?sortBy=priceAsc" target="_blank" rel="nofollow"><strong>apparel/sneakers from $7</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Grab the DJI Osmo Pocket 3 for $270 off in this early Black Friday deal — but this rebranded version is even less at $419 ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/forget-the-dji-osmo-pocket-3-this-early-black-friday-deal-gets-you-the-exact-same-camera-for-40-percent-off</link>
                                                                            <description>
                            <![CDATA[ The DJI Osmo Pocket 3 got a big price hike earlier this year but this Black Friday deal knocks hundreds off it and a nearly identical rebranded version. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">BVjfCngXkeGqYHQ8AFz6AP</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CZpKsp7hr9zUxnv6FAMSrN-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 22 Nov 2025 20:00:12 +0000</pubDate>                                                                                                                                <updated>Sun, 23 Nov 2025 17:11:04 +0000</updated>
                                                                                                                                            <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ anthony.spadafora@futurenet.com (Anthony Spadafora) ]]></author>                    <dc:creator><![CDATA[ Anthony Spadafora ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/z73LEoj7FkUjNG85GcWHtH.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Anthony Spadafora is the managing editor for security and home office furniture at Tom’s Guide where he covers everything from data breaches and malware to password managers and the best way to cover your whole home or business with a strong Wi-Fi signal.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Before joining the team, he spent three years covering cybersecurity and B2B tech for ITProPortal while living in South Korea. After moving back to the US. Anthony joined the TechRadar Pro team where he covered these topics along with VPNs, web hosting, online collaboration software and video conferencing for four years. Anthony also has his ears to the ground and is on the lookout for the next major cyberattack or data breach.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Based in Houston, Texas, Anthony also handles VPN testing for both Tom’s Guide and TechRadar. As someone who has worked from home exclusively since 2018, he has reviewed dozens of standing desks as well as office chairs and has taken a closer look at other essential remote working accessories. As part of these reviews, Anthony frequently builds intricate desk setups which is why he’s such a big advocate for cable management and keeping things organized. When he’s not writing, he can be found tinkering with PCs and game consoles, managing cables and making upgrades to his smart home.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/CZpKsp7hr9zUxnv6FAMSrN-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Osmo Pocket 3 camera with a Tom&#039;s Guide Black Friday Price Drop deals badge]]></media:description>                                                            <media:text><![CDATA[A DJI Osmo Pocket 3 camera with a Tom&#039;s Guide Black Friday Price Drop deals badge]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Osmo Pocket 3 camera with a Tom&#039;s Guide Black Friday Price Drop deals badge]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CZpKsp7hr9zUxnv6FAMSrN-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you’re looking to start vlogging or just want to upgrade your current setup, the DJI Osmo Pocket 3 is one of the most versatile and best cameras for the job. However, due to tariff price hikes earlier this year, it’s since shot up in price. Thanks to <a href="https://www.tomsguide.com/black-friday-deals-and-sales">Black Friday deals</a> though, you can grab it or an even cheaper rebranded version at a steep discount.</p><p>Right now, you can pick up the <a href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD?th=1">DJI Osmo Pocket 3 for just $529 on Amazon</a>. That’s 34% or $270 off its new price. However, if you like the look and features of the Osmo Pocket 3, there’s a rebranded version on sale for even less. You save over $100 by skipping DJI’s vlogging camera and getting the <a href="https://www.amazon.com/Xtra-Vlogging-Stabilizer-Focusing-Photography/dp/B0FL9DN3GY">Xtra Muse for $419</a> instead. This is an even better deal at 40% off and it’s also the lowest price ever for this almost identical camera.</p><div class="product"><a data-dimension112="fb8f88df-d577-45d5-9b13-14dee4a9b1d9" data-action="Deal Block" data-label="The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage. This early Black Friday deal brings the DJI Osmo Pocket 3 almost back to its all-time low price." data-dimension48="The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage. This early Black Friday deal brings the DJI Osmo Pocket 3 almost back to its all-time low price." data-dimension25="$529" href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD?th=1" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vmxWbj6M4Ne3zJqUM3GmJF" name="Osmo Pocket 3" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vmxWbj6M4Ne3zJqUM3GmJF.jpg" mos="" align="middle" fullscreen="" width="1440" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage. This early Black Friday deal brings the DJI Osmo Pocket 3 almost back to its all-time low price.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-Rotatable-Touchscreen-Photography/dp/B0CG19QXWD?th=1" target="_blank" rel="nofollow" data-dimension112="fb8f88df-d577-45d5-9b13-14dee4a9b1d9" data-action="Deal Block" data-label="The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage. This early Black Friday deal brings the DJI Osmo Pocket 3 almost back to its all-time low price." data-dimension48="The DJI Osmo Pocket 3 is the perfect tool for vloggers and content creators, providing an affordable gimbal solution to give their video a professional look. It features awesome stabilization, strong low light performance and great battery life, all the while capturing stunning 4K footage. This early Black Friday deal brings the DJI Osmo Pocket 3 almost back to its all-time low price." data-dimension25="$529">View Deal</a></p></div><div class="product"><a data-dimension112="beb6dbed-b928-47d0-9f53-444ca23a38ae" data-action="Deal Block" data-label="If you want a DJI Osmo Pocket 3 for even less, this rebranded version is nearly identical in every way. The Xtra Muse has the exact same design, button layout and even menus that DJI’s popular vlogging camera does. Along with the camera itself, you also get the same accessories you would with the Osmo Pocket 3. However, in addition to a wrist strap, charging cable and threaded handle, you get a carrying bag too." data-dimension48="If you want a DJI Osmo Pocket 3 for even less, this rebranded version is nearly identical in every way. The Xtra Muse has the exact same design, button layout and even menus that DJI’s popular vlogging camera does. Along with the camera itself, you also get the same accessories you would with the Osmo Pocket 3. However, in addition to a wrist strap, charging cable and threaded handle, you get a carrying bag too." data-dimension25="$419" href="https://www.amazon.com/Xtra-Vlogging-Stabilizer-Focusing-Photography/dp/B0FL9DN3GY" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1440px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="vCRMDsc5TcRtSDHQPRUviG" name="Muse" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vCRMDsc5TcRtSDHQPRUviG.jpg" mos="" align="middle" fullscreen="" width="1440" height="1440" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want a DJI Osmo Pocket 3 for even less, this rebranded version is nearly identical in every way. The Xtra Muse has the exact same design, button layout and even menus that DJI’s popular vlogging camera does. Along with the camera itself, you also get the same accessories you would with the Osmo Pocket 3. However, in addition to a wrist strap, charging cable and threaded handle, you get a carrying bag too.<a class="view-deal button" href="https://www.amazon.com/Xtra-Vlogging-Stabilizer-Focusing-Photography/dp/B0FL9DN3GY" target="_blank" rel="nofollow" data-dimension112="beb6dbed-b928-47d0-9f53-444ca23a38ae" data-action="Deal Block" data-label="If you want a DJI Osmo Pocket 3 for even less, this rebranded version is nearly identical in every way. The Xtra Muse has the exact same design, button layout and even menus that DJI’s popular vlogging camera does. Along with the camera itself, you also get the same accessories you would with the Osmo Pocket 3. However, in addition to a wrist strap, charging cable and threaded handle, you get a carrying bag too." data-dimension48="If you want a DJI Osmo Pocket 3 for even less, this rebranded version is nearly identical in every way. The Xtra Muse has the exact same design, button layout and even menus that DJI’s popular vlogging camera does. Along with the camera itself, you also get the same accessories you would with the Osmo Pocket 3. However, in addition to a wrist strap, charging cable and threaded handle, you get a carrying bag too." data-dimension25="$419">View Deal</a></p></div><p>Now I wouldn’t blame you for going with the DJI Osmo Pocket 3 over the Xtra Muse. After all, it is the original. In our <a href="https://www.tomsguide.com/reviews/dji-osmo-pocket-3">DJI Osmo Pocket 3 review</a>, our camera editor Peter Wolinski praised it as a fantastic 4K gimbal camera that’s almost perfect with a 4.5 star rating. It’s worth noting though that the latest rumors suggest the new Osmo Pocket 4 could be revealed any day now.</p><p>Now for the Xtra Muse, while we haven’t tested one ourselves yet, by all accounts it’s a functionally and physically near-identical clone of the Osmo Pocket 3. Many believe it’s a rebranded version that was released specifically to get around tariff price hikes in the US.</p><p>When it comes to physical differences between the two, the only thing I can see as someone who owns an Osmo Pocket 3 myself, is the DJI branding has been replaced with the Xtra logo underneath the joystick and record button. You won’t have to worry about finding accessories for the Xtra Muse either as all of the ones designed for the Osmo Pocket 3 will work with this camera too.</p><p>The only big downside I can see to opting for the Xtra Muse over the Osmo Pocket 3 is the fact that you don’t get native wireless microphone support with the former. Instead, you’ll need to plug a wireless mic receiver into its USB port. At the same time, the Xtra Muse App, which is nearly identical to the DJI Mimo one, is a bit less intuitive and not nearly as polished. You also don’t get as strong of a warranty as you would with the Osmo Pocket 3.</p><p>The choice is yours but with either of these deals, you’re getting a compact and highly versatile vlogging camera that can shoot in either landscape or portrait mode just by changing the orientation of its rotatable screen.</p><p><em>For more discounts, check out our </em><a href="https://www.tomsguide.com/live/news/amazon-black-friday-2025-lego-yeti-dyson"><em>Amazon Black Friday deals live blog</em></a><em>.</em></p><h3 class="article-body__section" id="section-shop-today-s-best-black-friday-deals"><span>Shop today's best Black Friday deals</span></h3><ul><li><strong>Amazon: </strong><a href="https://www.amazon.com/b?node=210998206011" target="_blank" rel="nofollow"><strong>50% off Ring, Ninja, AirPods and more</strong></a><strong></strong></li><li><strong>Walmart Plus: </strong><a href="https://www.walmart.com/plus" target="_blank" rel="nofollow"><strong>50% off @ Walmart</strong></a></li><li><strong>REI: </strong><a href="https://www.rei.com/f/scd-deals" target="_blank" rel="nofollow"><strong>half-off Arc'teryx, Patagonia, more</strong></a><strong></strong></li><li><strong>Dell: </strong><a href="https://www.dell.com/en-us/shop/deals?sortBy=price-ascending" target="_blank" rel="nofollow"><strong>monitors from $69, laptops from $299</strong></a><strong></strong></li><li><strong>Nectar: </strong><a href="https://www.nectarsleep.com/" target="_blank" rel="nofollow"><strong>50% off mattresses + bundles</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/site/all-electronics-on-sale/all-computers-tablets-on-sale/pcmcat1632941704767.c?id=pcmcat1632941704767" target="_blank" rel="nofollow"><strong>laptops from $149</strong></a><strong></strong></li><li><strong>Lenovo: </strong><a href="https://www.lenovo.com/us/en/d/deals/laptops/?IPromoID=LEN380027&sortBy=priceUp" target="_blank" rel="nofollow"><strong>doorbuster deals from $319</strong></a><strong></strong></li><li><strong>Wayfair: </strong><a href="https://www.wayfair.com/daily-sales" target="_blank" rel="nofollow"><strong>up to 80% off home decor</strong></a><strong></strong></li><li><strong>Lululemon: </strong><a href="https://shop.lululemon.com/c/we-made-too-much/n18mhd?Ns=price%7C0" target="_blank" rel="nofollow"><strong>top picks from $9</strong></a><strong></strong></li><li><strong>Newegg: </strong><a href="https://www.newegg.com/Black-November-Early-Access/EventSaleStore/ID-1132" target="_blank" rel="nofollow"><strong>Doorbuster deals from $6</strong></a></li><li><strong>Walmart: </strong><a href="https://www.walmart.com/cp/gifts/3131907" target="_blank" rel="nofollow"><strong>holiday gifts from $15</strong></a></li><li><strong>Birkenstock: </strong><a href="https://www.nordstrom.com/browse/sale?sort=PercentOff&filterByBrand=birkenstock" target="_blank" rel="nofollow"><strong>deals from $20 @ Nordstrom</strong></a><strong></strong></li><li><strong>Saatva: </strong><a href="https://www.saatva.com/mattresses/saatva-classic?utm_source=futurepublishing&utm_medium=affiliate&coupon=awyqqgzvxqicebab" target="_blank" rel="nofollow"><strong>luxury mattresses from $1,099</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've been testing the DJI Osmo Mobile 8, and it's made my phone videos look like they were shot by Martin Scorsese ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/dji-osmo-mobile-8-review</link>
                                                                            <description>
                            <![CDATA[ The DJI Osmo Mobile 8 is the brand's best mobile gimbal yet, boasting a sturdy build, great handling, accurate AI tracking, and lots more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gJecAEQ7HKrmUqENWR5TSo</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XaZLCez3AjS8URctZUfFk7-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 05 Nov 2025 12:02:00 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:31:04 +0000</updated>
                                                                                                                                            <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/XaZLCez3AjS8URctZUfFk7-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Osmo Mobile 8 pocket-sized mobile gimbal]]></media:description>                                                            <media:text><![CDATA[A DJI Osmo Mobile 8 pocket-sized mobile gimbal]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Osmo Mobile 8 pocket-sized mobile gimbal]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XaZLCez3AjS8URctZUfFk7-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>What’s the point of a smartphone gimbal? Well, a gimbal can help you capture smooth and stabilized footage, keep your subject in focus with AI tracking features, and they’re often ergonomically-designed so you can continue shooting for long periods of time. DJI’s Osmo Mobile lineup does just that, and the latest addition to it, the DJI Osmo Mobile 8, is the brand’s best gimbal yet.</p><p>The Osmo Mobile 8 is a joy to handle, thanks to great weight distribution as well as a sturdy, premium build. It’s easy to use and when you use it in conjunction with the DJI Mimo app, you can record uber cool content effortlessly. AI tracking features ensure your subject is always the star of the show, and really, this gimbal is all you need for refined mobile content creation.</p><p>For the complete breakdown, read my full DJI Osmo Mobile 8 review.</p><p><strong>U.S. availability: </strong>Similar to the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> drones, the DJI Osmo Mobile 8 will not be officially available in the U.S. market through official websites on its global launch. We expect third-party retailers to sell it in the future though.</p><h2 class="article-body__section" id="section-dji-osmo-mobile-8-review-cheat-sheet"><span>DJI Osmo Mobile 8 review: Cheat sheet</span></h2><ul><li><strong>What is it?</strong> A mobile gimbal that succeeds the DJI Osmo Mobile 7P</li><li><strong>Who is it for?</strong> For content creators, vloggers and anyone else looking to elevate their content</li><li><strong>How much does it cost? </strong>The DJI Osmo Mobile 8 is available for £135, but the gimbal won't be available in the U.S. on its global launch</li><li><strong>What do we like? </strong>The sturdy build, great handling, easy setup, fantastic AI tracking features, and fill light for low-light shooting</li><li><strong>What don’t we like? </strong>It’s very app-reliant… but that isn’t a major flaw</li></ul><h2 class="article-body__section" id="section-dji-osmo-mobile-8-review-specs"><span>DJI Osmo Mobile 8 review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p><strong>Specs</strong></p></th><th  ><p><strong>DJI Osmo Mobile 8</strong></p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>£135</p></td></tr><tr><td class="firstcol " ><p><strong>Extension rod</strong></p></td><td  ><p>Built-in</p></td></tr><tr><td class="firstcol " ><p><strong>Max extension length</strong></p></td><td  ><p>8.46 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Phone weight</strong></p></td><td  ><p>5.9-10.5oz</p></td></tr><tr><td class="firstcol " ><p><strong>Phone thickness</strong></p></td><td  ><p>0.27-0.39 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Phone width</strong></p></td><td  ><p>2.63-3.3 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Pan controllable range</strong></p></td><td  ><p>360° (unlimited rotation)</p></td></tr><tr><td class="firstcol " ><p><strong>Roll controllable range</strong></p></td><td  ><p>-67° to 245°</p></td></tr><tr><td class="firstcol " ><p><strong>Tilt controllable range</strong></p></td><td  ><p>-20° to 40°</p></td></tr><tr><td class="firstcol " ><p><strong>Max control speed</strong></p></td><td  ><p>120°/s</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>USB-C wired, Bluetooth 5.3</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>3,350mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Battery life</strong></p></td><td  ><p>10 hours</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>8.97 x 4.21 x 3.77 inches (unfolded)</p><p>7.48 x 3.74 x 1.81 inches (folded)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight (Gimbal + built-in tripod + magnetic phone clamp + multifunctional module)</strong></p></td><td  ><p>13.05oz</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-osmo-mobile-8-review-the-ups"><span>DJI Osmo Mobile 8 review: The ups</span></h2><p>From its premium, sturdy build and handling to its AI tracking features and companion app, the DJI Osmo Mobile 8 is a straight-up winner.</p><h2 id="sturdy-premium-build">Sturdy, premium build</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SjZv7hkXKN5vvXrMGm7Km7" name="dji_OSMO_mobile_8_ 1.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/SjZv7hkXKN5vvXrMGm7Km7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve tested many of DJI’s products, such as the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a>, and one thing I think the brand has consistently nailed is its gear’s build quality — and it’s no different in the case of the DJI Osmo Mobile 8. This mobile gimbal is built extremely well with a teflon-coated grip and phone mount, just like the <a href="https://www.tomsguide.com/cameras-photography/dji-rs-4-mini-review-the-hands-free-gimbal-youve-been-waiting-for">DJI RS 4 Mini</a> ($369).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hCvMvTzvb7dvuHFCNdvdo7" name="dji_OSMO_mobile_8_ 9.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/hCvMvTzvb7dvuHFCNdvdo7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The hard rubber edges on either side of the phone mount provide a fantastic, reliable grip around your smartphone, so you don’t need to worry about it accidentally falling out. The mount’s hinges require a bit of force to pull apart so that you can slot your device, but I find that reassuring as I, like a <em>lot </em>of people, freak out if my phone is on the verge of falling to the ground.</p><h2 id="easy-as-pie-setup">Easy-as-pie setup</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7Kth7y94pLwx8tKqV4HQp7" name="dji_OSMO_mobile_8_ 10.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/7Kth7y94pLwx8tKqV4HQp7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>You’ll need to check your phone’s dimensions before buying the DJI Osmo Mobile 8. The extendable mount is ideal for phones whose width is between 2.63 and 3.3 inches, thickness between 0.27 and 0.39 inches, and the gimbal can withstand weigh up to 10.5oz. It worked great with my <a href="https://www.tomsguide.com/reviews/google-pixel-7-pro">Google Pixel 7 Pro</a> and my partner’s <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-9-review">Google Pixel 9</a>. I tried it with an <a href="https://www.tomsguide.com/reviews/iphone-15-pro-max">iPhone 15 Pro Max</a> too and faced zero issues.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XaZLCez3AjS8URctZUfFk7" name="dji_OSMO_mobile_8_ 11.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/XaZLCez3AjS8URctZUfFk7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Mounting your phone is easy and straightforward, and there are two ways of using the Osmo Mobile 8: you can plug one end of the (included) short USB-C cable into your phone and the other into the rotating mount, or you can connect wirelessly via Bluetooth 5.3. In my testing, both connection modes worked flawlessly with zero lag or latency issues.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jcquG5fk8NSQrk96oYzGn7" name="dji_OSMO_mobile_8_ 3.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/jcquG5fk8NSQrk96oYzGn7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Similar to its predecessor, the <a href="https://www.youtube.com/watch?v=U4OnDcqcIWc">DJI Osmo Mobile 7P</a> (<a href="https://www.amazon.com/DJI-6941565997517-Osmo-Mobile-Gimbal/dp/B07FTG84SW/" target="_blank" rel="nofollow">$149</a>), the Osmo Mobile 8 features a tripod built directly into the handle. The tripod’s legs are a little on the thin side and I wouldn’t expect it to withstand strong gusts of wind, but it’s still handy for on-the-go vlogging. I’d recommend carrying a trusty tripod which you can screw into the tripod thread located on the handle’s bottom if you plan on shooting in extremely windy conditions.</p><h2 id="great-handling">Great handling</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="z9kYHeU2Pnir43zyUCDfp7" name="dji_OSMO_mobile_8_ 6.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/z9kYHeU2Pnir43zyUCDfp7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the key selling points of any gimbal lies in its comfort and handling, and the DJI Osmo Mobile 8 checks both boxes. I’ve found it extremely comfortable to hold for long periods of time. The area your fingers curl around has a slightly textured grip which helps with handling by providing a sturdy hold on the gimbal.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="UofKCbahCVNN7L4EyqYMn7" name="dji_OSMO_mobile_8_ 2.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/UofKCbahCVNN7L4EyqYMn7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Weight distribution is great too, and I never felt weighed down and the gimbal never felt unstable when my phone was mounted. Speaking of, when the Osmo Mobile 8 is fully assembled (gimbal + built-in tripod + magnetic phone clamp + multifunctional module) without a smartphone mounted, it weighs 13.05oz, which means it’s easy to carry around in a backpack or small bag. It also folds down to just 7.48 x 3.74 x 1.81 inches so it doesn’t take up too much space, and you can store it safely in the included pouch.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/4cGE3XftndA" allowfullscreen></iframe></div></div><p>The Osmo Mobile 8 has a built-in extension rod too, and even at its longest, it doesn’t feel awkward or unstable to handle.</p><h2 id="built-in-lighting">Built-in lighting</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vzXh8JdDNuSTrxfKYRyyn7" name="dji_OSMO_mobile_8_ 8.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/vzXh8JdDNuSTrxfKYRyyn7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I mentioned a multifunctional module in the previous section, but what do I mean by that? First introduced on the DJI Osmo Mobile 7P, the DJI Osmo Mobile 8 features a thumb-sized module attached to the phone mount, and it houses a tracking sensor as well as a tiny light. It uses magnets and a press-button release to stay securely locked in place.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="srhMj2MYPqX6628RP5iek7" name="dji_OSMO_mobile_8_ 7.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/srhMj2MYPqX6628RP5iek7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The multifunctional module doubles as a receiver for DJI Mics, including the <a href="https://www.tomsguide.com/audio/dji-mic-mini-review">DJI Mic Mini</a> and the <a href="https://www.tomsguide.com/reviews/dji-mic-2">DJI Mic 2</a> and 3, so you don’t need to use a separate receiver. Aside from this and powering AI tracking features, the module features a tiny LED light which comes in handy if you’re shooting in dimly lit environments. It has a maximum illumination of 40 lux (which pales in comparison to the <a href="https://www.tomsguide.com/best-picks/best-ring-lights">best ring lights</a> but hey, it’s not a ring light) and it has a variable color temperature of 2500-6000K, which can be controlled via the buttons on the side.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/uS9abiNse6EWf3WEgmx8aF.jpg" alt="A photo taken using the DJI Osmo Mobile 8's fill lighting" /><figcaption>2500K color temperature and 100% brightness.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/tW4RDKzY96fTkQ3fo6KvZF.jpg" alt="A photo taken using the DJI Osmo Mobile 8's fill lighting" /><figcaption>6000K color temperature and 100% brightness.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>To test out the fill light’s effectiveness, I took a few photos with the brightness and color temperature set to different levels in a dark room, as you can see above. The first photo was taken at 2500K color temperature and 100% brightness, while the second was taken at 6000K color temperature. Both photos look great, with plenty of detail in my tattoos and face discernible.</p><h2 id="excellent-companion-app">Excellent companion app</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SLN7i5LkQGyiUzFmrB6Vp7" name="dji_OSMO_mobile_8_ 4.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/SLN7i5LkQGyiUzFmrB6Vp7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The DJI Osmo Mobile 8 is accompanied by the <a href="https://www.dji.com/uk/downloads/djiapp/dji-mimo" target="_blank" rel="nofollow">DJI Mimo</a> smartphone app — the same app used for its <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action cameras</a> — and it’s very user-friendly and easy to use. You’ll need it if you want to use the Osmo Mobile 8’s AI tracking features, edit footage, update its firmware, and so on, all of which is easy to do.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/ILpb0nyAhR0" allowfullscreen></iframe></div></div><p>One thing I appreciate about the app is that it gives you plenty of tutorials so you can make the most of the gimbal. One of these features is the “Dyna-Zoom” shooting mode, which is basically like dolly zoom, where you move either in or out to create a dynamic effect. You can see how this works in the video above, which I think looks great, and it’s an easy way of adding flavor to your video work.</p><h2 id="fantastic-stabilization-and-ai-tracking">Fantastic stabilization and AI tracking</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/isUZ5rh8oKw" allowfullscreen></iframe></div></div><p>Most smartphones have some degree of stabilization built into them, but it’s not always the best. If you want stabilized footage, then the DJI Osmo Mobile 8 is a must. It captures smooth footage regardless of whether you’re walking, panning, tilting or rolling. It features 360° unlimited rotation while panning so you can capture sweeping vistas with ease. You can see examples of stabilization and panning in the video above.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Irl8eR78ZK0" allowfullscreen></iframe></div></div><p>The Osmo Mobile 8 utilizes Tracking 7.0 and ActiveTrack 360° to, well, track humans, animals, birds and objects. This is something I’m familiar with as DJI’s drones feature ActiveTrack 360° too. All you have to do is draw a box on your phone’s screen around the subject you want to track, and the gimbal will keep tracking it within its pan, roll and tilt limits.</p><p>I tested this out by tracking a pigeon, a swan and myself in three separate scenarios, and you can see the result in the video above. All three subjects remain in focus regardless of how I move the Osmo Mobile 8 — or don’t, as the gimbal automatically rotates as needed to continue tracking.</p><h2 class="article-body__section" id="section-dji-osmo-mobile-8-review-the-downs"><span>DJI Osmo Mobile 8 review: The downs</span></h2><p>The DJI Osmo Mobile 8 doesn’t have any noteworthy flaws, but it’s worth mentioning that it relies heavily on the DJI Mimo app.</p><h2 id="app-reliant">App-reliant</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7REdVpdaVCado7RBeheLo7" name="dji_OSMO_mobile_8_ 5.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/7REdVpdaVCado7RBeheLo7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This isn’t a <em>massive </em>con, but the DJI Osmo Mobile 8 is very app-reliant. While you can use it with your phone’s stock camera app, you’ll need to download the DJI Mimo app to utilize the gimbal’s AI tracking features. I haven’t found the app to be a drain on system resources so it isn’t a burden on your phone. Again, not a dealbreaker, but something to keep in mind if you’re wondering why you can’t track a subject when using your camera app.</p><h2 class="article-body__section" id="section-dji-osmo-mobile-8-review-verdict"><span>DJI Osmo Mobile 8 review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LEuxYkqVLCBismEa63VPi7" name="dji_OSMO_mobile_8_.JPG" alt="A DJI Osmo Mobile 8 pocket-sized mobile gimbal" src="https://cdn.mos.cms.futurecdn.net/LEuxYkqVLCBismEa63VPi7.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you want a mobile gimbal to elevate your content creation, I can’t recommend the DJI Osmo Mobile 8 enough. It’s great to handle and it’s built extremely well. It’s easy to carry around too, and it has fantastic stabilization, panning, tilting and rolling capabilities.</p><p>Although the Osmo Mobile 8 relies heavily on its app, the companion app is user-friendly and easy to use, enabling you to capture dynamic footage. The Osmo Mobile 8 is compatible with a wide array of smartphones, and it helps even amateur videographers create beautiful content.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ DJI drone ban just got one step closer after FCC vote — what you need to know ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/fcc-just-voted-to-retroactively-ban-dji-drones-heres-what-you-need-to-know</link>
                                                                            <description>
                            <![CDATA[ The FCC voted to allow itself to retroactively ban DJI drones in the name of national security. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xVAEN9Zj4H2fUjcf7wEYxV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/XCzhoVTzFikC6oASuEvNBQ-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 03 Nov 2025 19:46:03 +0000</pubDate>                                                                                                                                <updated>Tue, 04 Nov 2025 22:37:05 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></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/XCzhoVTzFikC6oASuEvNBQ-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A dark gray DJI Air 3S drone]]></media:description>                                                            <media:text><![CDATA[A dark gray DJI Air 3S drone]]></media:text>
                                <media:title type="plain"><![CDATA[A dark gray DJI Air 3S drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/XCzhoVTzFikC6oASuEvNBQ-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Today (November 3), the Federal Communications Commission (FCC) voted unanimously 3-0 to give itself the <a href="https://docs.fcc.gov/public/attachments/DOC-415051A1.pdf" target="_blank">ability to retroactively ban devices and radio components</a> that were previously approved for entry into the United States, if the manufacturers are later deemed a national security risk.</p><p>First reported by <a href="https://www.theverge.com/report/808104/fcc-order-retroactive-ban-transmitter-national-security" target="_blank">The Verge</a>, the vote is being sold as a national security measure to prevent Chinese telecom devices from gaining a backdoor into U.S. networks. In practice, it likely means that drone maker DJI, maker of most of the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a>, will be prevented from importing new drones or wireless devices into the country starting on December 23.</p><p>In early October, when today's vote was <a href="https://dronedj.com/2025/10/12/dji-drone-ban-us-fcc/" target="_blank">initially proposed</a>, FCC head Brendon Carr said the new rules would give the agency "new tools to safeguard our networks from insecure spy gear." The rules allow the FCC to not only block new products for companies on its "Covered List," but also older devices.</p><p>The Covered List features companies that have been deemed to "pose an unacceptable risk to the national security of the United States or the security and safety of United States persons," according to the FCC. </p><p>Currently, <a href="https://www.fcc.gov/supplychain/coveredlist" target="_blank">that list</a> is mostly made up of Chinese companies like Huawei (banned since 2019) and the Russian anti-virus maker Kaspersky, <a href="https://www.tomsguide.com/computing/antivirus/us-government-bans-kaspersky-antivirus-software-what-you-need-to-know">which was banned in 2024</a>.</p><p>DJI hasn't been specifically named by the FCC, but it's likely the company won't be off it for long. A spokesperson noted that DJI is not on the Covered List but the possibility it will be added is highly likely.</p><h2 id="how-we-got-here-2">How we got here</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YU9jBt5fAihHYuVQ7RHJDS" name="DJI Mini 3 controller.jpg" alt="DJI Mini 3" src="https://cdn.mos.cms.futurecdn.net/YU9jBt5fAihHYuVQ7RHJDS.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In December 2024, the US Senate passed the <a href="https://www.reuters.com/world/us/majority-us-senate-backs-massive-defense-bill-voting-continues-2024-12-18/" target="_blank">National Defense Authorization Act</a> (NDAA), the annual defense spending bill. As part of that bill, a national security agency has to proactively audit a company and state that it does not pose a risk to national security. It was initially <a href="https://www.tomsguide.com/cameras-photography/drones/dji-drone-sales-ban-just-passed-the-us-house-heres-what-happens-next">passed by the U.S. House</a> of Representatives in June 2024..</p><p>If not, the companies are added to the Covered List which would bar the FCC from authorizing their internal radios for use in the United States. Lacking that authorization effectively bans the devices for import and sale.</p><p>As of this writing, no U.S. national security agency has taken up an audit of DJI. "If that assessment is not completed by the deadline, DJI and another Chinese drone manufacturer would automatically be added to the FCC’s Covered List, without any evidence of wrongdoing or the right to appeal," DJI's Head of Global Policy Adam Welsh told Tom's Guide in a statement.</p><p>Welsh went on to say that DJI welcomes an audit.</p><p>"We urge the U.S. government to start the mandated review or grant an extension to ensure a fair, evidence-based process that protects American jobs, safety, and innovation."</p><h2 id="can-you-still-fly-your-drone">Can you still fly your drone?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nfWxAh9Qxzt9xWwNFurHFF" name="FCC editshutterstock_1963495504.jpg" alt="FCC logo on computer screen with magnifying glass" src="https://cdn.mos.cms.futurecdn.net/nfWxAh9Qxzt9xWwNFurHFF.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>Even if the ban goes through, those in the U.S. who already own a DJI drone would still be able to fly them. However, a ban could mean that DJI might stop updating its app for U.S. customers, and there could be other issues with cloud-based features. </p><p>The FCC is also insisting that it won't take away existing DJI devices. A potential ban is a case-by-case basis. "[The] Commission should exercise revocation of devices containing prohibited components only in extraordinary circumstances and only on a case-by-case basis after specific national security agency determination."</p><p>Additionally, the public is allowed to weigh in on retroactive bans via a 30-day public comment period. </p><h2 id="what-dji-drones-can-you-still-buy">What DJI drones can you still buy?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2048px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2h3muDgz4HntnDRUn9mpcL" name="DJI Flip - Hero" alt="DJI Flip - Hero" src="https://cdn.mos.cms.futurecdn.net/2h3muDgz4HntnDRUn9mpcL.jpg" mos="" align="middle" fullscreen="" width="2048" height="1152" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Due to the ongoing issues, DJI has not listed two of its newer models — the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> and the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> — for sale on its website, but you can find them at Amazon and other retailers. </p><p>In addition, there are a number of older DJI devices still available to purchase in the U.S., though due to the uncertainties of the ban and the age of the drones, might be increasingly hard to come by.</p><ul><li><a href="https://www.amazon.com/DJI-Three-Battery-QuickShots-Stabilized-Controller-Free/dp/B0DDS1368S" target="_blank" rel="nofollow">DJI Neo 3 ($187)</a></li><li><a href="https://www.amazon.com/dp/B0CXJCXN17" target="_blank" rel="nofollow">DJi Mini 4K ($299)</a></li><li><a href="https://www.amazon.com/DJI-Mini-RC-Lightweight-Intelligent/dp/B0BL3R3L45?th=1" target="_blank" rel="nofollow">DJI Mini 3 ($419)</a></li><li><a href="https://www.amazon.com/DJI-Controller-Takeoff-Intelligent-Batteries/dp/B0DJ1FKDGP" target="_blank" rel="nofollow">DJI Flip ($439)</a></li><li><a href="https://www.amazon.com/DJI-Beginners-Omnidirectional-ActiveTrack-Batteries/dp/B0F6XN1J7K?th=1" target="_blank" rel="nofollow">DJI Mini 5 Pro ($759)</a></li><li><a href="https://www.amazon.com/DJI-Batteries-Immersive-Experience-Acrobatics/dp/B0CS6HVW6P?th=1" target="_blank" rel="nofollow">DJI Avata 2 ($999)</a></li><li><a href="https://www.amazon.com/DJI-Controller-Wide-Angle-Omnidirectional-Batteries/dp/B07FVZFFXD" target="_blank" rel="nofollow">DJI Air 3S ($1,099)</a></li><li><a href="https://www.amazon.com/DJI-Flagship-Tri-Camera-Hasselblad-Transmission/dp/B0DS2HDF1M?th=1" target="_blank" rel="nofollow">DJI Mavic 4 Pro ($2,730)</a></li></ul><h2 id="other-chinese-companies-affected">Other Chinese companies affected</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="x8V4oP22NqvmDt9htX88UE" name="tiktok ban" alt="A person holding a phone with the TikTok logo crossed out displayed on the screen, with a blurry image of the tiktok homepage in the background" src="https://cdn.mos.cms.futurecdn.net/x8V4oP22NqvmDt9htX88UE.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>In September 2025, DJI <a href="https://www.theverge.com/news/786540/dji-loses-chinese-military-company-lawsuit-dod" target="_blank">lost a lawsuit</a> against the U.S. Department of Defense over the military agency labeling it as a "Chinese Military Company." Though the federal judge allowed the Pentagon to continue using that title, they found no proof DJI is controlled by Beijing.</p><p>DJI isn't the only Chinese-owned company facing scrutiny by the U.S. Huawei <a href="https://www.tomsguide.com/us/how-huawei-google-ban-affects-you,news-30154.html">was initially banned in 2019</a> and added to the Covered List in 2021. </p><p>The <a href="https://www.tomsguide.com/computing/online-security/what-will-happen-if-tiktok-is-banned">TikTok saga finally ended</a> this past September with the sale of the U.S. assets of ByteDance's social media app. While the company's app was technically banned in January 2025, the deadline to enforce the ban was continually extended.</p><p>Meanwhile, <a href="https://www.tomsguide.com/computing/routers/tp-link-ban">TP-Link Wi-Fi routers are next</a> on the potential ban list, and it's possible this retroactive ban ruling could affect the company. Multiple U.S. agencies, including the Justice Department and the Department of Defense, spent this past summer looking into banning the manufacturer.</p><p>While DJI drones might not be banned on December 23, it's looking highly likely that the company won't come out unscathed either way with no U.S. agencies taking up the audit. We'll know more come the end of the year.</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/cameras-photography/drones/i-test-drones-for-a-living-heres-what-i-think-of-reddits-top-recommendations-for-beginners">I test drones for a living — here’s what I think of Reddit’s top recommendations for beginners</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/i-gave-the-dji-mini-5-pro-5-stars-and-its-finally-available-to-buy-in-the-u-s-but-not-through-dji">I gave the DJI Mini 5 Pro 5 stars and it’s finally available to buy in the U.S. — but not through DJI</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/id-never-flown-a-drone-until-the-antigravity-a1-look-at-what-i-could-shoot-after-only-five-minutes">I’d never flown a drone until the Antigravity A1 but look at what I could shoot after only five minutes</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I gave the DJI Mini 5 Pro 5 stars and it’s finally available to buy in the U.S. — but not through DJI ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/i-gave-the-dji-mini-5-pro-5-stars-and-its-finally-available-to-buy-in-the-u-s-but-not-through-dji</link>
                                                                            <description>
                            <![CDATA[ Less than a month since its launch, the DJI Mini 5 Pro is available in the U.S., and you can buy it through Amazon right now! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">u7RmnSZbguvCVvgKE6Lm6C</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8uTwQqfTZYs965efEktRc8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 29 Oct 2025 11:36:10 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/8uTwQqfTZYs965efEktRc8-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A dark grey DJI Mini 5 Pro drone]]></media:description>                                                            <media:text><![CDATA[A dark grey DJI Mini 5 Pro drone]]></media:text>
                                <media:title type="plain"><![CDATA[A dark grey DJI Mini 5 Pro drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8uTwQqfTZYs965efEktRc8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a> is my favorite mini drone. Scratch that. It is <em>the </em>best mini drone money can buy right now, period. Alongside its very advanced uncle, the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a>, it is only the second drone I've ever given a full 5/5 star rating to. It's extremely easy to fly, it captures incredible 4K/60fps footage, and its free-rotating gimbal lets you get very creative with your shots.</p><p>But at launch, the Mini 5 Pro wasn't available in the U.S., just like the Mavic 4 Pro. DJI cited market conditions and noted that it would continue evaluating the "evolving industry environment" before making the drone available through the official website.</p><p>While we got to enjoy the Mini 5 Pro in the U.K., Europe, Australia and other parts of the world, Americans couldn't — until now. Rejoice, my American friends, it's like Christmas has come early, as you can finally buy the Mini 5 Pro, but not through DJI. You'll have to shake hands with <a href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">Amazon instead</a>.</p><div class="product"><a data-dimension112="13b1b79a-2fd7-4ad3-91fc-4669dcee3e06" data-action="Deal Block" data-label="The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension48="The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension25="$1397" href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XJ7W9M/" 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:94.80%;"><img id="oey3DVjRPNTJAX3h9syZuD" name="DJI-Mini-5-Pro deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oey3DVjRPNTJAX3h9syZuD.jpg" mos="" align="middle" fullscreen="" width="1500" height="1422" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor.<a class="view-deal button" href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow" data-dimension112="13b1b79a-2fd7-4ad3-91fc-4669dcee3e06" data-action="Deal Block" data-label="The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension48="The DJI Mini 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension25="$1397">View Deal</a></p></div><p>On Amazon, the Mini 5 Pro is available in a few bundles. You can grab just <a href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">the drone and the RC-N3 controller for $1,397</a>. Amazon is also stocking <a href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XN1J7K/" target="_blank" rel="nofollow">the Fly More Combo for $1,708</a>, and it comes with the RC-2 controller, ND filters, spare batteries and a shoulder bag.</p><p>If you're willing to spend even more, you can get <a href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XK911R/" target="_blank" rel="nofollow">the Fly More Combo for $1,929</a>, and it comes with all the aforementioned goodies as well as Intelligent Flight Battery Plus' which bump up the flight time to 52 minutes per charge.</p><p>That's a lot of money, I know, and definitely more than what the drone costs in the U.K. But if you want best-in-class flying and photographing, you won't go wrong with the Mini 5 Pro. It improves on its predecessor, the <a href="https://www.tomsguide.com/reviews/5-things-i-like-about-the-dji-mini-4-pro-and-2-things-i-hate">DJI Mini 4 Pro</a>, to deliver an unmatched  experience.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iVSrVbW87p0" allowfullscreen></iframe></div></div><p>The Mini 5 Pro packs a powerful, large 1-inch sensor for improved low-light performance and 4K/60fps HDR video capture. It's a mini that thinks big. Like the bigger, prosumer-focused <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review">DJI Air 3S</a>, the Mini 5 Pro captures 50MP photos, remains stable in windy conditions up to 12 m/s or 26.8mph.</p><p>Another addition to the Mini 5 Pro is omnidirectional obstacle avoidance supplemented with forward-facing LiDAR and an infrared sensor at the bottom of the aircraft. This means that the drone can detect obstacles all around it and either bypass or brake in front of them.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/GDJzddtmY3w" allowfullscreen></iframe></div></div><p>Having LiDAR helps the drone to sense objects more reliably too, even in low-light environments. <em>And </em>it can return back to its last takeoff position even without GPS, so you can fly more confidently. The Mini 5 Pro has <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-safety-features">the most advanced safety features on a mini drone aimed at beginners</a>.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Ww0FITWUldI" allowfullscreen></iframe></div></div><p>One of my favorite features on the Mini 5 Pro is one that it has inherited from the Mavic 4 Pro: the 225° gimbal which enables flexible and dynamic camera movement as well as wide-angle rotation. This free-moving gimbal lets you experiment with different kinds of shots, get creative, and it's extremely fun to use. It can be combined with the drone's short-form QuickShot modes too!</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4Uiqt5CH6yKxG8eVKWTDc8.jpg" alt="A dark grey DJI Mini 5 Pro drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Qwt8pcM9389gD6QLN9aZd8.jpg" alt="A dark grey DJI Mini 5 Pro drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/6uiMryMcw894qZbpAR6Rd8.jpg" alt="A dark grey DJI Mini 5 Pro drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/epYiNpHjQs4KmWZhHGSHd8.jpg" alt="A dark grey DJI Mini 5 Pro drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-safety-features">The DJI Mini 5 Pro has the best safety features for beginners, and their importance can’t be overstated</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">I’ve spent three weeks testing the DJI Mini 5 Pro — and it sets a new gold standard for mini drones</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2025</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Act fast! The DJI Neo has crashed to its lowest ever price for October Prime Day — and today’s your last chance to buy it ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/act-fast-the-dji-neo-has-crashed-to-its-lowest-ever-price-for-october-prime-day-and-todays-your-last-chance-to-buy-it</link>
                                                                            <description>
                            <![CDATA[ 4K/30fps video, 12MP stills, 22GB of internal storage, all packed into a lightweight body and for just $159?! This deal is too good to be true! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">bmRQPf9LVEA7TYbXiguzD8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RqtxRUJ5hz9dPMfYbhRraG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 08 Oct 2025 15:18:15 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Staff Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo.&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/RqtxRUJ5hz9dPMfYbhRraG-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Neo]]></media:description>                                                            <media:text><![CDATA[A DJI Neo]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Neo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RqtxRUJ5hz9dPMfYbhRraG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Ring-a-ding-ding! What's that sound you hear? Why, only the bell that rings when it's the last day of <a href="https://www.tomsguide.com/live/news/best-prime-big-deal-days-october-2025">October Prime Day sales</a>. All of yesterday and today, we've seen some killer discounts on photography gear, such as action cameras and drones. As someone who tests drones for a living and loves flying them in her spare time, I wanted to highlight the finest drone deal today — and it's on our top pick for the best budget drone.</p><p>That's right: the <a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow"><strong>DJI Neo is currently 20% off at Amazon right now</strong></a>. It's down to just $159 — its lowest ever price — which makes it a better deal than the one we saw last Black Friday. Today is your last chance to save big on the little drone that could, and there's no guarantee this deal will resurface come Black Friday or Cyber Monday.</p><div class="product"><a data-dimension112="c2eea85d-c478-47b5-b66e-2bd4a4dbb90c" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159" href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" 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="yQ2D9952vwuZALYFFAiFF6" name="Neo-dealbox" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yQ2D9952vwuZALYFFAiFF6.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Neo costs very little to begin with, and I recommend it even at its full price, so this deal is too good to pass up. In my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review" data-dimension112="c2eea85d-c478-47b5-b66e-2bd4a4dbb90c" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159">DJI Neo review,</a> I praised this drone for its lightweight, compact and minimalistic design. It can shoot 4K footage at 30fps, take detailed stills, and remain stable in tricky conditions. Easy to control with the RC-N3 controller or the DJI Fly app on a smartphone, the Neo makes drone photography more accessible thanks to its low price point.<a class="view-deal button" href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow" data-dimension112="c2eea85d-c478-47b5-b66e-2bd4a4dbb90c" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159">View Deal</a></p></div><p>If you want an easy-to-use drone that doesn't require any registration, and can be flown indoors or around children, then I can't recommend the Neo enough. The Neo is one of the safest drones to fly, thanks to its propeller guards. This also means that you can grab it mid-air, and the Neo features palm takeoff and landing, so all you need to do is place your hand under it and it will land. Super convenient and safe!</p><p>I have been flying the Neo for nearly a year now, and it has never once let me down. It's the cheapest way to get a 4K/30fps drone that also captures 12MP stills. It comes with 22GB of internal storage, and footage can be easily offloaded to your smartphone with the DJI Fly app. </p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/jBc3WRBU4G4" allowfullscreen></iframe></div></div><p>What's great about the Neo is that it's fantastic for creating short-form content, thanks to QuickShot modes such as Follow, Rocket, Circle, etc. You don't even need a controller or your smartphone for this. Simply press the button on top to cycle through and toggle one of these modes. The drone will then record you/your subject and return to its last-known takeoff position when it's done recording.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/kEGEwypZVmk" allowfullscreen></iframe></div></div><p>Flying the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> can be really addicting — trust me, even since I flew my first drone, I haven't been able to stop. It can <a href="https://www.tomsguide.com/cameras-photography/drones/the-dji-air-3s-is-the-one-drone-id-buy-with-my-own-money-heres-why-it-brings-me-unbridled-joy">help unleash your creativity</a> and capture amazing sights from a bird's point of view. Drones don't have to break the bank either, as has been proven by the Neo.</p><p>Right now, it's at its lowest ever price, as you can get the <a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow">Neo for 20% off at Amazon</a>. It's really a no-brainer if you want a quadcopter that's easy to fly with or without a smartphone, makes content creation easy, and <a href="https://www.tomsguide.com/cameras-photography/drones/ive-been-flying-the-dji-neo-for-10-months-heres-my-verdict-spoiler-alert-its-underrated">lets you have fun with your friends, family or solo</a>!</p><p><em>For more great discounts, be sure to check out our </em><a href="https://www.tomsguide.com/live/news/best-prime-big-deal-days-october-2025"><em>Amazon Prime Day deals live blog</em></a><em> right now.</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/live/news/ive-picked-the-best-october-prime-day-deals-2025">Final hours! I've found the best Amazon Prime Day deals LIVE from $9 on Apple, Kindles, laptops, TVs & more — shop before it's too late</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/ive-been-flying-the-dji-neo-for-10-months-heres-my-verdict-spoiler-alert-its-underrated">I've been flying the DJI Neo for 10 months — here's my verdict (spoiler alert: it's underrated)</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2025</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I test action cameras for a living and these are the 7 October Prime Day deals I recommend ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/i-test-action-cameras-for-a-living-and-these-are-the-october-prime-day-deals-i-recommend</link>
                                                                            <description>
                            <![CDATA[ Save on GoPro, DJI and Insta360 gear with these October Prime Day action camera deals. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TP8QHk8MSAbRDrCjd7N4Zb</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/rCfttVnHgWW2gMMkBpUW3A-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 07 Oct 2025 13:43:04 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/rCfttVnHgWW2gMMkBpUW3A-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The GoPro Hero13 Black against a blue background with a Tom&#039;s Guide Prime Day deal badge in the lower right of the image]]></media:description>                                                            <media:text><![CDATA[The GoPro Hero13 Black against a blue background with a Tom&#039;s Guide Prime Day deal badge in the lower right of the image]]></media:text>
                                <media:title type="plain"><![CDATA[The GoPro Hero13 Black against a blue background with a Tom&#039;s Guide Prime Day deal badge in the lower right of the image]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/rCfttVnHgWW2gMMkBpUW3A-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Amazon's October Prime Day deals have arrived, and there are some decent discounts to be had on rugged camera gear. As both Tom's Guide's reviews editor and cameras editor, I spend my days testing out the <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html">best action cameras</a> and <a href="https://www.tomsguide.com/us/best-360-cameras,review-3737.html">best 360 cameras</a> around, putting them through their paces in our expert reviews.</p><p>There are lot of discounts advertised, but not all are good deals, as manufacturers sometimes hike prices before these events to make deals seem more attractive. So how do you know which deals are actually worth it? Don't worry: I'm here to tell you. </p><p>Thankfully, there are some great offers out there today, like this deal on the <a href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" target="_blank" rel="nofollow">DJI Osmo Action 5, which is currently $70 off at Amazon</a>.</p><p>And there are more where that came from. Read on to see my favorite October Prime Day action camera deals.</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><strong>Akaso 360: </strong><a href="https://www.amazon.com/dp/B0FD2VHNRY/" target="_blank" rel="nofollow"><strong>was $219 now $186 @ Amazon</strong></a><strong></strong></li><li><strong>DJI Osmo Action 4: </strong><a href="https://www.amazon.com/DJI-Waterproof-Low-Light-Performance-Long-Lasting/dp/B0C783YNW7" target="_blank" rel="nofollow"><strong>was $299 now $229 @ Amazon</strong></a><strong></strong></li><li><strong>DJI Osmo Action 5 Pro: </strong><a href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" target="_blank" rel="nofollow"><strong>was $339 now $269 @ Amazon</strong></a><strong></strong></li><li><strong>GoPro Hero13 Black (Forest Green): </strong><a href="https://www.amazon.com/GoPro-HERO13-Black-Action-Bundle/dp/B0F9R3NV3X" target="_blank" rel="nofollow"><strong>was $429 now $359 @ Amazon</strong></a><strong> </strong></li><li><strong>Insta360 X4: </strong><a href="https://www.amazon.com/Insta360-Standard-Bundle-Waterproof-Stabilization/dp/B0DBQBMQH2" target="_blank" rel="nofollow"><strong>was $349 now $319 @ Amazon</strong></a><strong></strong></li><li><strong>DJI Osmo 360: </strong><a href="https://www.amazon.com/dp/B0DTTZZ6Q3/" target="_blank" rel="nofollow"><strong>was $549 now $412 @ Amazon</strong></a><strong></strong></li><li><strong>Insta360 X5: </strong><a href="https://www.amazon.com/dp/B0DZCBYCNY" target="_blank" rel="nofollow"><strong>was $549 now $499 @ Amazon</strong></a><strong></strong></li></ul><h3 class="article-body__section" id="section-october-prime-day-action-camera-deals"><span>October Prime Day action camera deals</span></h3><div class="product"><a data-dimension112="628d78a7-aab5-48b4-96cb-e8f5985f90bf" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$269" href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" 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:84.00%;"><img id="ZjbfZ45E3afFQJCzAjxoiM" name="DJI OA5P QUICK LIST" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ZjbfZ45E3afFQJCzAjxoiM.jpg" mos="" align="middle" fullscreen="" width="500" height="420" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review" data-dimension112="628d78a7-aab5-48b4-96cb-e8f5985f90bf" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$269">DJI Osmo Action 5 Pro</a> is my favorite action camera right now. It was already the best value for money cam out there before this deal! It packs 4K/60fps, pro recording features (D-Log, 10-bit color), excellent stablization, best-in-class 65-foot waterproofing, strong battery life and seamless integration with other cameras in the DJI ecosystem. It's perfect for virtually any type of high-octane content creation or vlogging. At $70 off, this is my top pick of all the deals in October Prime Day.<a class="view-deal button" href="https://www.amazon.com/DJI-Essential-Waterproof-Stabilization-Touchscreens/dp/B0DS2DF5S5" target="_blank" rel="nofollow" data-dimension112="628d78a7-aab5-48b4-96cb-e8f5985f90bf" data-action="Deal Block" data-label="DJI Osmo Action 5 Pro" data-dimension48="DJI Osmo Action 5 Pro" data-dimension25="$269">View Deal</a></p></div><div class="product"><a data-dimension112="6cb85b6b-e8e9-4e10-84bf-270ae6c627ad" data-action="Deal Block" data-label="DJI Osmo Action 4" data-dimension48="DJI Osmo Action 4" data-dimension25="$229" href="https://www.amazon.com/DJI-Waterproof-Low-Light-Performance-Long-Lasting/dp/B0C783YNW7" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1166px;"><p class="vanilla-image-block" style="padding-top:63.46%;"><img id="WPEZSaK94BRxYeCGATrHdH" name="DJI Osmo Action 4.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/WPEZSaK94BRxYeCGATrHdH.jpg" mos="" align="middle" fullscreen="" width="1166" height="740" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>It may be an older camera, having launched in 2023, but the <a href="https://www.tomsguide.com/reviews/dji-osmo-action-4" data-dimension112="6cb85b6b-e8e9-4e10-84bf-270ae6c627ad" data-action="Deal Block" data-label="DJI Osmo Action 4" data-dimension48="DJI Osmo Action 4" data-dimension25="$229">DJI Osmo Action 4</a> is still an ideal camera for high-octane content creation. It's incredibly rugged and waterproof down to 59 feet. It'll also shoot 4K/60p and packs some pro recording features like D-Log and 10-bit color. The Osmo Action 5 Pro offers stronger stabilization, so if you can stretch to that camera, I would advise doing that. However, for $229 the OA4 is still a fantastic camera for the money.<a class="view-deal button" href="https://www.amazon.com/DJI-Waterproof-Low-Light-Performance-Long-Lasting/dp/B0C783YNW7" target="_blank" rel="nofollow" data-dimension112="6cb85b6b-e8e9-4e10-84bf-270ae6c627ad" data-action="Deal Block" data-label="DJI Osmo Action 4" data-dimension48="DJI Osmo Action 4" data-dimension25="$229">View Deal</a></p></div><div class="product"><a data-dimension112="8bed0a9b-9f2f-446d-b8cb-984dce17d9b0" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="$359" href="https://www.amazon.com/GoPro-HERO13-Black-Action-Bundle/dp/B0F9R3NV3X" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:795px;"><p class="vanilla-image-block" style="padding-top:90.94%;"><img id="XYV7jNhKVi79crhdhRF2gn" name="GoPro H13B Forest Green" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XYV7jNhKVi79crhdhRF2gn.jpg" mos="" align="middle" fullscreen="" width="795" height="723" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>In my <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-hero13-black-can-the-champ-keep-his-title" data-dimension112="8bed0a9b-9f2f-446d-b8cb-984dce17d9b0" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="$359">GoPro Hero13 Black review</a>, I awarded the camera 4.5-stars. It shoots 5.3K at up to 60fps and is waterproof to 33 feet. GoPro fitted the 13th iteration with a new lens mount that can use a variety of Lens Mods, allowing you to get creative with your optics. This isn't the cheapest we've seen this model sell for, with it dropping as low as $329 in the past, so it might be worth keeping an eye on this deal to see if prices drop any further.<a class="view-deal button" href="https://www.amazon.com/GoPro-HERO13-Black-Action-Bundle/dp/B0F9R3NV3X" target="_blank" rel="nofollow" data-dimension112="8bed0a9b-9f2f-446d-b8cb-984dce17d9b0" data-action="Deal Block" data-label="GoPro Hero13 Black review" data-dimension48="GoPro Hero13 Black review" data-dimension25="$359">View Deal</a></p></div><h3 class="article-body__section" id="section-october-prime-day-360-camera-deals"><span>October Prime Day 360 camera deals</span></h3><div class="product"><a data-dimension112="86eed484-aa34-4a0c-a3b7-5b66d60a21ee" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$412" href="https://www.amazon.com/dp/B0DTTZZ6Q3/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1090px;"><p class="vanilla-image-block" style="padding-top:137.61%;"><img id="yUXRL4qFis7QUzehxiNGTN" name="DJI Osmo 360" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yUXRL4qFis7QUzehxiNGTN.jpg" mos="" align="middle" fullscreen="" width="1090" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I wasn't expecting to see discounts on the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review" data-dimension112="86eed484-aa34-4a0c-a3b7-5b66d60a21ee" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$412">DJI Osmo 360</a> given it only launched a couple of months ago. This is quite a hefty discount, too, and a very attractive price. Expect 8K 360 footage, 4K reframing in 16:9, decent stabilization and strong internal audio. The Osmo 360 also uses the same mounting system and batteries as the OA5 Pro, so accessories are interchangeable. <a class="view-deal button" href="https://www.amazon.com/dp/B0DTTZZ6Q3/" target="_blank" rel="nofollow" data-dimension112="86eed484-aa34-4a0c-a3b7-5b66d60a21ee" data-action="Deal Block" data-label="DJI Osmo 360" data-dimension48="DJI Osmo 360" data-dimension25="$412">View Deal</a></p></div><div class="product"><a data-dimension112="eda7fb4c-acf9-4009-93be-4270525b4438" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="$499" href="https://www.amazon.com/dp/B0DZCBYCNY" 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:111.40%;"><img id="yGDrsxDPAa6hgWeYP9bM5h" name="Insta360 X5" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yGDrsxDPAa6hgWeYP9bM5h.jpg" mos="" align="middle" fullscreen="" width="500" height="557" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x5-review" data-dimension112="eda7fb4c-acf9-4009-93be-4270525b4438" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="$499">Insta360 X5</a> is the finest 360 camera you can buy, packing 8K 360-degree video for reframing in up to 4K. Its internal microphones are excellent, and a big reason to spend the extra money versus the DJI Osmo 360. It also features impressive battery life, while the Insta360 smartphone and desktop apps make editing and reframing 360 footage a breeze.<a class="view-deal button" href="https://www.amazon.com/dp/B0DZCBYCNY" target="_blank" rel="nofollow" data-dimension112="eda7fb4c-acf9-4009-93be-4270525b4438" data-action="Deal Block" data-label="Insta360 X5" data-dimension48="Insta360 X5" data-dimension25="$499">View Deal</a></p></div><div class="product"><a data-dimension112="f70263e8-4533-40d3-b0f7-9c686a49f89f" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="$319" href="https://www.amazon.com/Insta360-Standard-Bundle-Waterproof-Stabilization/dp/B0DBQBMQH2" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:135px;"><p class="vanilla-image-block" style="padding-top:262.96%;"><img id="Zekb84rtFtrZC48rT29n5a" name="Insta360 X4" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Zekb84rtFtrZC48rT29n5a.jpg" mos="" align="middle" fullscreen="" width="135" height="355" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-x4-review-the-ultimate-360-camera" data-dimension112="f70263e8-4533-40d3-b0f7-9c686a49f89f" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="$319">Insta360 X4</a> has now been succeeded by the X5, and the latter is a much, much better camera thanks to its upgraded microphones and sensors. That said, the X4 is still a fantastic 360 camera which shoots in 8K, meaning up-to 4K exports in 16:9. At $319, this is an extremely attractive deal — this is a lot of camera for the money.<a class="view-deal button" href="https://www.amazon.com/Insta360-Standard-Bundle-Waterproof-Stabilization/dp/B0DBQBMQH2" target="_blank" rel="nofollow" data-dimension112="f70263e8-4533-40d3-b0f7-9c686a49f89f" data-action="Deal Block" data-label="Insta360 X4" data-dimension48="Insta360 X4" data-dimension25="$319">View Deal</a></p></div><div class="product"><a data-dimension112="36fcdb79-e3bb-4490-8efc-40482c396114" data-action="Deal Block" data-label="I won't beat around the bush: this camera cannot compete with Insta360 or DJI. I'm currently testing the Akaso 360, and it's behind the curve compared to today's 8K cameras. However, for $200, this is really as much 360 camera as you can expect. This camera shoots 5.7K 360 footage, which will allow reframed content at up to 2.7K. If you have the money, you should look at an X4 or even an older original GoPro Max. If you're super tight on funds, though, there's no arguing with the Akaso's budget price tag." data-dimension48="I won't beat around the bush: this camera cannot compete with Insta360 or DJI. I'm currently testing the Akaso 360, and it's behind the curve compared to today's 8K cameras. However, for $200, this is really as much 360 camera as you can expect. This camera shoots 5.7K 360 footage, which will allow reframed content at up to 2.7K. If you have the money, you should look at an X4 or even an older original GoPro Max. If you're super tight on funds, though, there's no arguing with the Akaso's budget price tag." data-dimension25="$186" href="https://www.amazon.com/dp/B0FD2VHNRY/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1158px;"><p class="vanilla-image-block" style="padding-top:129.53%;"><img id="vAarzLLcn84rEXtbiUkFmT" name="Akaso 360" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vAarzLLcn84rEXtbiUkFmT.jpg" mos="" align="middle" fullscreen="" width="1158" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>I won't beat around the bush: this camera cannot compete with Insta360 or DJI. I'm currently testing the Akaso 360, and it's behind the curve compared to today's 8K cameras. However, for $200, this is really as much 360 camera as you can expect. This camera shoots 5.7K 360 footage, which will allow reframed content at up to 2.7K. If you have the money, you should look at an X4 or even an older original GoPro Max. If you're super tight on funds, though, there's no arguing with the Akaso's budget price tag.<a class="view-deal button" href="https://www.amazon.com/dp/B0FD2VHNRY/" target="_blank" rel="nofollow" data-dimension112="36fcdb79-e3bb-4490-8efc-40482c396114" data-action="Deal Block" data-label="I won't beat around the bush: this camera cannot compete with Insta360 or DJI. I'm currently testing the Akaso 360, and it's behind the curve compared to today's 8K cameras. However, for $200, this is really as much 360 camera as you can expect. This camera shoots 5.7K 360 footage, which will allow reframed content at up to 2.7K. If you have the money, you should look at an X4 or even an older original GoPro Max. If you're super tight on funds, though, there's no arguing with the Akaso's budget price tag." data-dimension48="I won't beat around the bush: this camera cannot compete with Insta360 or DJI. I'm currently testing the Akaso 360, and it's behind the curve compared to today's 8K cameras. However, for $200, this is really as much 360 camera as you can expect. This camera shoots 5.7K 360 footage, which will allow reframed content at up to 2.7K. If you have the money, you should look at an X4 or even an older original GoPro Max. If you're super tight on funds, though, there's no arguing with the Akaso's budget price tag." data-dimension25="$186">View Deal</a></p></div><p><em>For more great discounts, be sure to check out our </em><a href="https://www.tomsguide.com/live/news/best-prime-big-deal-days-october-2025#mrfhud=true" target="_blank"><em>Amazon Prime Day deals live blog</em></a><em> right now.</em></p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Last chance! Save big on my favorite DJI, HoverAir and Potensic drones this October Prime Day ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/october-prime-day-drone-deals</link>
                                                                            <description>
                            <![CDATA[ My favorite drones from the big three are discounted by up to 34% off this October Prime Day! ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rrq3at78RumL7CyGSkUwYZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/RqtxRUJ5hz9dPMfYbhRraG-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 07 Oct 2025 12:55:33 +0000</pubDate>                                                                                                                                <updated>Wed, 08 Oct 2025 11:39:54 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Staff Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo.&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/RqtxRUJ5hz9dPMfYbhRraG-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Neo]]></media:description>                                                            <media:text><![CDATA[A DJI Neo]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Neo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/RqtxRUJ5hz9dPMfYbhRraG-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Final call! It's the last day of this year's <a href="https://www.tomsguide.com/live/news/best-prime-big-deal-days-october-2025">October Prime Day</a> sales. We've seen some fantastic discounts on our favorite tech already, such as TVs, laptops, home appliances, and more. Here at Tom's Guide, I review the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a>, so it's my job to find you the best deals on the likes of DJI, Potensic and HoverAir.</p><p>If you've been thinking of getting a drone, now is your last chance to do so before Black Friday. My favorite deal is the one on the <a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow">DJI Neo for $159 at Amazon</a>, which is currently 20% off its retail price of $199. If you want a non-DJI drone that takes great selfies, check out the <a href="https://www.amazon.com/HOVERAir-X1-Self-Flying-Pocket-Sized-Intelligent/dp/B0CDCFGF1V/" target="_blank" rel="nofollow">HoverAir X1 which is just $265</a> and a whopping 34% off at Amazon.</p><p>There are many more deals for you to take advantage of, and I'd recommend snagging them while you can as we may not see them again until Black Friday. So, without further ado, here are the seven best drone deals this October Prime Day. For more great discounts, be sure to check out our <a href="https://www.tomsguide.com/live/news/best-prime-big-deal-days-october-2025">Amazon Prime Day deals live blog</a> right now.</p><h2 class="article-body__section" id="section-quick-links"><span>Quick links</span></h2><ul><li><a href="https://www.amazon.com/Hobby-RC-Quadcopters-Multirotors/b/?ie=UTF8&node=11608080011" target="_blank" rel="nofollow"><strong>shop all drone deals at Amazon</strong></a></li><li><strong>DJI Neo: </strong><a href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow"><strong>was $199 now $159</strong></a></li><li><strong>Potensic Atom SE: </strong><a href="https://www.amazon.com/Potensic-Camera-Transmission-Lightweight-Foldable/dp/B0BFWS4N4T/" target="_blank" rel="nofollow"><strong>was $299 now $229</strong></a></li><li><strong>DJI Mini 4K: </strong><a href="https://www.amazon.com/DJI-Stabilization-Transmission-Resistance-Battery/dp/B0CXJDDJ9X/" target="_blank" rel="nofollow"><strong>was $299 now $239</strong></a></li><li><strong>HoverAir X1 Combo: </strong><a href="https://www.amazon.com/HOVERAir-X1-Self-Flying-Pocket-Sized-Intelligent/dp/B0CDCFGF1V/" target="_blank" rel="nofollow"><strong>was $399 now $265</strong></a></li><li><strong>Potensic Atom 2: </strong><a href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow"><strong>was $479 now $399</strong></a></li><li><strong>DJI Mini 3 Fly More Combo: </strong><a href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B0BL3R3L45/" target="_blank" rel="nofollow"><strong>was $719 now $575</strong></a></li><li><strong>HoverAir X1 Pro Basic Combo: </strong><a href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTFP57S/" target="_blank" rel="nofollow"><strong>was $755 now $639</strong></a></li></ul><h2 class="article-body__section" id="section-best-october-prime-day-drone-deals"><span>Best October Prime Day drone deals</span></h2><div class="product"><a data-dimension112="7497605b-9ad8-4f0d-bbd0-2dd48193bb55" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$265" href="https://www.amazon.com/HOVERAir-X1-Self-Flying-Pocket-Sized-Intelligent/dp/B0CDCFGF1V/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1441px;"><p class="vanilla-image-block" style="padding-top:92.23%;"><img id="DNC8WM5nWsq28ydhTF8jj" name="HoverAir-X1-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/DNC8WM5nWsq28ydhTF8jj.jpg" mos="" align="middle" fullscreen="" width="1441" height="1329" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The HoverAir X1 is a great selfie drone as it can fly without a controller or a smartphone — all you need to do is press the buttons on its body, and it'll record short-form videos. My colleague <a href="https://www.tomsguide.com/features/sorry-dji-this-pocketable-folding-drone-is-the-most-fun-ive-had-flying-in-a-long-time" data-dimension112="7497605b-9ad8-4f0d-bbd0-2dd48193bb55" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$265">enjoyed using it a lot</a> and appreciated its surprisingly good obstacle avoidance and subject tracking features such as follow, rocket, and more. This combo includes a storage bag, a charging hub, and a USB cable.<a class="view-deal button" href="https://www.amazon.com/HOVERAir-X1-Self-Flying-Pocket-Sized-Intelligent/dp/B0CDCFGF1V/" target="_blank" rel="nofollow" data-dimension112="7497605b-9ad8-4f0d-bbd0-2dd48193bb55" data-action="Deal Block" data-label="enjoyed using it a lot" data-dimension48="enjoyed using it a lot" data-dimension25="$265">View Deal</a></p></div><div class="product"><a data-dimension112="2d3b91e0-1f7f-4008-871c-cfc5df9fb574" data-action="Deal Block" data-label="my HoverAir X1 Pro/ProMax review" data-dimension48="my HoverAir X1 Pro/ProMax review" data-dimension25="$639" href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTFP57S/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1415px;"><p class="vanilla-image-block" style="padding-top:97.53%;"><img id="bMXeCLyydw4zmkJv92WUk" name="HoverAir-X1-Pro-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/bMXeCLyydw4zmkJv92WUk.jpg" mos="" align="middle" fullscreen="" width="1415" height="1380" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Featuring 32GB of internal storage, the HoverAir X1 Pro is a lovely little drone that can capture 4K/60fps and FHD/120fps slow-motion footage. It's extremely easy to fly, and in <a href="https://www.tomsguide.com/cameras-photography/drones/hoverair-x1-pro-promax-review" data-dimension112="2d3b91e0-1f7f-4008-871c-cfc5df9fb574" data-action="Deal Block" data-label="my HoverAir X1 Pro/ProMax review" data-dimension48="my HoverAir X1 Pro/ProMax review" data-dimension25="$639">my HoverAir X1 Pro/ProMax review</a>, I noted that the drone offered awesome hands-free shooting capabilities, going toe-to-toe with the DJI Neo. This combo includes a charging hub, a case, extra batteries, an adapter as well as USB cable.<a class="view-deal button" href="https://www.amazon.com/HOVERAir-Foldable-Automatic-OmniTerrain-SmoothCapture/dp/B0DGTFP57S/" target="_blank" rel="nofollow" data-dimension112="2d3b91e0-1f7f-4008-871c-cfc5df9fb574" data-action="Deal Block" data-label="my HoverAir X1 Pro/ProMax review" data-dimension48="my HoverAir X1 Pro/ProMax review" data-dimension25="$639">View Deal</a></p></div><div class="product"><a data-dimension112="e968ca75-f314-4d1d-a646-6f9fb563068a" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159" href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" 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="yQ2D9952vwuZALYFFAiFF6" name="Neo-dealbox" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yQ2D9952vwuZALYFFAiFF6.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Neo costs very little to begin with, and I recommend it even at its full price, so this deal is too good to pass up. In my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-neo-review" data-dimension112="e968ca75-f314-4d1d-a646-6f9fb563068a" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159">DJI Neo review,</a> I praised this drone for its lightweight, compact and minimalistic design. It can shoot 4K footage at 30fps, take detailed stills, and remain stable in tricky conditions. Easy to control with the RC-N3 controller or the DJI Fly app on a smartphone, the Neo makes drone photography more accessible thanks to its low price point.<a class="view-deal button" href="https://www.amazon.com/DJI-QuickShots-Stabilized-Propeller-Controller-Free/dp/B07FTPX71F/" target="_blank" rel="nofollow" data-dimension112="e968ca75-f314-4d1d-a646-6f9fb563068a" data-action="Deal Block" data-label="DJI Neo review," data-dimension48="DJI Neo review," data-dimension25="$159">View Deal</a></p></div><div class="product"><a data-dimension112="0a83c493-51f6-4056-b971-ea759384e164" data-action="Deal Block" data-label="We have all been preoccupied by the launch of the DJI Mini 5 Pro, but that doesn't mean the other DJI Mini drones should be ignored or underestimated. The Mini 3 is highly capable, boasting the ability to shoot vertical video, 4K/30fps horizontal video, a 38-minute flight time, and more. The Fly More Combo includes a shoulder bag, a DJI RC controller, as well as a charging hub and extra batteries." data-dimension48="We have all been preoccupied by the launch of the DJI Mini 5 Pro, but that doesn't mean the other DJI Mini drones should be ignored or underestimated. The Mini 3 is highly capable, boasting the ability to shoot vertical video, 4K/30fps horizontal video, a 38-minute flight time, and more. The Fly More Combo includes a shoulder bag, a DJI RC controller, as well as a charging hub and extra batteries." data-dimension25="$575" href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B0BL3R3L45/" 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:76.40%;"><img id="dv4MemdBp94uLw7A4wUJLj" name="DJI-Mini-3-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dv4MemdBp94uLw7A4wUJLj.jpg" mos="" align="middle" fullscreen="" width="1500" height="1146" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>We have all been preoccupied by the launch of the DJI Mini 5 Pro, but that doesn't mean the other DJI Mini drones should be ignored or underestimated. The Mini 3 is highly capable, boasting the ability to shoot vertical video, 4K/30fps horizontal video, a 38-minute flight time, and more. The Fly More Combo includes a shoulder bag, a DJI RC controller, as well as a charging hub and extra batteries.<a class="view-deal button" href="https://www.amazon.com/DJI-Mini-Fly-More-Combo/dp/B0BL3R3L45/" target="_blank" rel="nofollow" data-dimension112="0a83c493-51f6-4056-b971-ea759384e164" data-action="Deal Block" data-label="We have all been preoccupied by the launch of the DJI Mini 5 Pro, but that doesn't mean the other DJI Mini drones should be ignored or underestimated. The Mini 3 is highly capable, boasting the ability to shoot vertical video, 4K/30fps horizontal video, a 38-minute flight time, and more. The Fly More Combo includes a shoulder bag, a DJI RC controller, as well as a charging hub and extra batteries." data-dimension48="We have all been preoccupied by the launch of the DJI Mini 5 Pro, but that doesn't mean the other DJI Mini drones should be ignored or underestimated. The Mini 3 is highly capable, boasting the ability to shoot vertical video, 4K/30fps horizontal video, a 38-minute flight time, and more. The Fly More Combo includes a shoulder bag, a DJI RC controller, as well as a charging hub and extra batteries." data-dimension25="$575">View Deal</a></p></div><div class="product"><a data-dimension112="e1def4b6-a347-4710-944e-3d8b861e9c41" data-action="Deal Block" data-label="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts. This deal includes a DJI RC-N1 controller." data-dimension48="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts. This deal includes a DJI RC-N1 controller." data-dimension25="$239" href="https://www.amazon.com/DJI-Stabilization-Transmission-Resistance-Battery/dp/B0CXJDDJ9X/" 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:92.20%;"><img id="PgvNvPxsvHpkPD86QX6xFj" name="DJI-Mini-4K-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/PgvNvPxsvHpkPD86QX6xFj.jpg" mos="" align="middle" fullscreen="" width="1500" height="1383" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts. This deal includes a DJI RC-N1 controller.<a class="view-deal button" href="https://www.amazon.com/DJI-Stabilization-Transmission-Resistance-Battery/dp/B0CXJDDJ9X/" target="_blank" rel="nofollow" data-dimension112="e1def4b6-a347-4710-944e-3d8b861e9c41" data-action="Deal Block" data-label="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts. This deal includes a DJI RC-N1 controller." data-dimension48="The DJI Mini 4K features some pro specs. Not only can you capture 4K/30fps footage, but you also get access to QuickShots and panoramas with a 31-minute flight time. The drone also features a smart return to home and stable hovering, making it the ideal drone for beginners and drone enthusiasts. This deal includes a DJI RC-N1 controller." data-dimension25="$239">View Deal</a></p></div><div class="product"><a data-dimension112="11e4628e-eae2-487e-99f8-c3c8a8e61d38" data-action="Deal Block" data-label="my Potensic Atom 2 review" data-dimension48="my Potensic Atom 2 review" data-dimension25="$399" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" 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:78.13%;"><img id="QEqNG4iNnxL2KBjVQKhum8" name="Potensic-Atom-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QEqNG4iNnxL2KBjVQKhum8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1172" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Potensic Atom 2 is <em>even better </em>than its predecessor, as it can capture 48MP stills. In <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review" data-dimension112="11e4628e-eae2-487e-99f8-c3c8a8e61d38" data-action="Deal Block" data-label="my Potensic Atom 2 review" data-dimension48="my Potensic Atom 2 review" data-dimension25="$399">my Potensic Atom 2 review</a>, I noted that it records stable, smooth 4K/30fps video and features advanced, accurate AI subject tracking, along with a new, easy-to-use controller and app. It features an AI Night Mode that reduces grain when shooting in low-light conditions. It’s also lightweight yet sturdy. This deal includes extra batteries and a carry bag.<a class="view-deal button" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow" data-dimension112="11e4628e-eae2-487e-99f8-c3c8a8e61d38" data-action="Deal Block" data-label="my Potensic Atom 2 review" data-dimension48="my Potensic Atom 2 review" data-dimension25="$399">View Deal</a></p></div><div class="product"><a data-dimension112="5701b962-2630-4ef6-ab7b-72373078f756" data-action="Deal Block" data-label="The Potensic Atom SE Fly More Combo includes the drone, an extra batteries, the controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots." data-dimension48="The Potensic Atom SE Fly More Combo includes the drone, an extra batteries, the controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots." data-dimension25="$229" href="https://www.amazon.com/Potensic-Camera-Transmission-Lightweight-Foldable/dp/B0BFWS4N4T/" 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:85.07%;"><img id="3KWSsskXttPZuAv5CLmFic" name="Potensic-Atom-SE-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/3KWSsskXttPZuAv5CLmFic.jpg" mos="" align="middle" fullscreen="" width="1500" height="1276" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Potensic Atom SE Fly More Combo includes the drone, an extra batteries, the controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots.<a class="view-deal button" href="https://www.amazon.com/Potensic-Camera-Transmission-Lightweight-Foldable/dp/B0BFWS4N4T/" target="_blank" rel="nofollow" data-dimension112="5701b962-2630-4ef6-ab7b-72373078f756" data-action="Deal Block" data-label="The Potensic Atom SE Fly More Combo includes the drone, an extra batteries, the controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots." data-dimension48="The Potensic Atom SE Fly More Combo includes the drone, an extra batteries, the controller, and a carry bag. The drone weighs less than 249g, so you don't need to register with the F.A.A. in the U.S. or the C.A.A. in the U.K. The Atom SE is a great starting point for new drone pilots." data-dimension25="$229">View Deal</a></p></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/live/news/best-prime-big-deal-days-october-2025">71+ Amazon Prime Day deals LIVE — best sales now on Kindles, iPads, TVs, laptops and more</a></li><li><a href="https://www.tomsguide.com/sales-events/i-found-the-best-prime-day-deals-under-usd25-my-top-29-best-deals-on-stanley-apple-lego-skechers-and-more">I found the best Prime Day deals under $25 — my top 29 best deals on Stanley, Apple, Lego, Skechers and more</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2025</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The DJI Mini 5 Pro has the best safety features for beginners, and their importance can’t be overstated ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-safety-features</link>
                                                                            <description>
                            <![CDATA[ The DJI Mini 5 Pro is outstanding in nearly every aspect, but its advanced safety features, such as obstacle avoidance with LiDAR, make it even better. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">NjmoTnHptCwHnMAQci3zyj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/oHUrqXi8N5XSpECYTge32E-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 05 Oct 2025 09:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Drones]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Staff Writer on the Reviews team at Tom&#039;s Guide, and she&#039;s always on the lookout for the latest tech. She is a lifelong gaming and photography enthusiast, especially interested in wildlife and landscape photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and her Google Pixel 7 Pro. She&#039;s also a licensed drone pilot and instant cameras expert so you&#039;ll find her testing these almost every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo.&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/oHUrqXi8N5XSpECYTge32E-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A DJI Mini 5 Pro drone]]></media:description>                                                            <media:text><![CDATA[A DJI Mini 5 Pro drone]]></media:text>
                                <media:title type="plain"><![CDATA[A DJI Mini 5 Pro drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/oHUrqXi8N5XSpECYTge32E-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro</a>. Wow. <em>What a drone</em>. It's been out for less than a month and it's already made headlines as one of the <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> money can buy right now. I flew it for three weeks before publishing my full <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro review</a>, and my verdict? Well, I gave it a full 5/5 star rating, so that itself says a lot about its aerial prowess. It is now one of only two drones that has a 100% rating at Tom's Guide — the other being the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a>.</p><p>Packing a powerful 1-inch sensor for improved low-light performance and 4K/60fps HDR video, the Mini 5 Pro is DJI's finest mini drone yet. Scratch that; it is <em>the </em>best mini quadcopter right now, and that's not even down to its imaging quality. Beginners, enthusiasts or even experienced pilots will appreciate the Mini 5 Pro's plethora of safety features, and these are something you won't find on any other sub-250g drone.</p><p><em>The DJI Mini 5 Pro is currently not available in the U.S. This is similar to the Mavic 4 Pro, the Osmo 360 and the Osmo Nano's state at launch. They weren't available to buy immediately when they came out, but they became available on third-party retailers (such as Walmart and Amazon) a few weeks later. Our best guess is that this will also be the case with the Mini 5 Pro, and we expect third-party sellers to stock it in the near future.</em></p><div class="product"><a data-dimension112="0a697d11-2bcb-48ef-9f9e-91dc2289bb3d" data-action="Deal Block" data-label="The DJI MIni 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension48="The DJI MIni 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension25="£689" href="https://www.amazon.co.uk/DJI-Mini-More-Combo-RC-N3/dp/B0F6XJ7W9M/" 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:94.80%;"><img id="oey3DVjRPNTJAX3h9syZuD" name="DJI-Mini-5-Pro deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/oey3DVjRPNTJAX3h9syZuD.jpg" mos="" align="middle" fullscreen="" width="1500" height="1422" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The DJI MIni 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor.<a class="view-deal button" href="https://www.amazon.co.uk/DJI-Mini-More-Combo-RC-N3/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow" data-dimension112="0a697d11-2bcb-48ef-9f9e-91dc2289bb3d" data-action="Deal Block" data-label="The DJI MIni 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension48="The DJI MIni 5 Pro sets a new standard for safety and imaging quality in mini drones. With omnidirectional obstacle avoidance and forward-facing LiDAR, the drone is capable of returning home even without GPS. It introduces a few notable upgrades as compared to its predecessor: a 1-inch sensor for improved low-light performance, 225° gimbal rotation, all while retaining a compact form factor." data-dimension25="£689">View Deal</a></p></div><p>The Mini 5 Pro has received significant safety upgrades over its predecessor, the <a href="https://www.tomsguide.com/reviews/5-things-i-like-about-the-dji-mini-4-pro-and-2-things-i-hate">DJI Mini 4 Pro</a>. Its advanced obstacle avoidance and braking capabilities give a lot of reassurance and peace of mind to pilots. It didn't take long for this drone to become one of my favorites — it honestly feels like flying a tiny <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review">DJI Air 3S</a> or a Mavic 4 Pro. Without further ado, here's what makes the Mini 5 Pro a force to be reckoned with.</p><h2 id="a-mini-that-thinks-big">A mini that thinks big</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qwt8pcM9389gD6QLN9aZd8" name="dji_mini_5_pro 9.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/Qwt8pcM9389gD6QLN9aZd8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro review</a>, I said that the brand's latest drone feels like the lovechild of the DJI Mavic 4 Pro and the DJI Air 3S — and that's not just down to the dark gray coat of paint. Even in terms of specs, the Mini 5 Pro bears resemblance to the Air 3S. For instance, both quadcopters can film 4K/60fps footage, capture 50MP photos, remain stable in windy conditions up to 12 m/s or 26.8mph.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/z1q5cirg4E8" allowfullscreen></iframe></div></div><p>Not just that, but the Mini 5 Pro has also inherited omnidirectional obstacle avoidance supplemented with forward-facing LiDAR and an infrared sensor at the bottom of the aircraft. What exactly does that mean, you ask? The drone can detect obstacles all around it and it can either brake in front of or bypass them.</p><p>Having LiDAR (which was missing from its predecessor) means the drone can sense objects more reliably, even in low-light environments. This makes flying at night safer. I can't overstate just how rare this level of obstacle avoidance is in mini drones — the Mini 5 Pro is the only sub-250g drone offering this tech right now.</p><h2 id="crawling-back-to-you">Crawling back to you</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/GDJzddtmY3w" allowfullscreen></iframe></div></div><p>Safety is paramount when flying a drone, and when you can't always keep an eye on it at nighttime, that's where LiDAR comes in clutch. The DJI Mini 5 Pro's return-to-home function has received a significant upgrade too, and thanks to LiDAR, the drone can now return to its last takeoff position even if it loses its GPS signal. Nifty!</p><p>Not only is this fantastic (and reassuring) for beginners, but it's useful for more experience pilots too. Even though I fly drones for a living, I have had my fair share of close calls while testing when I've suddenly lost the GPS signal and have waited with bated breath to miraculously get it back. Not with the Mini 5 Pro. I've never felt as confident flying a mini drone as I have with the Mini 5 Pro.</p><h2 id="a-stacked-feature-set">A stacked feature set</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4Uiqt5CH6yKxG8eVKWTDc8" name="dji_mini_5_pro 13.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/4Uiqt5CH6yKxG8eVKWTDc8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Aside from its top-notch safety features, the DJI Mini 5 Pro is also packed with best-in-class imaging capabilities. It features a 1-inch sensor for improved low-light performance with a high dynamic range, a 225° gimbal which enables flexible and dynamic camera movement as well as wide-angle rotation, a 36-minute flight time, and lots more. All of this while maintaining a compact body? Sign me up!</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Ww0FITWUldI" allowfullscreen></iframe></div></div><p>Playing with the Mini 5 Pro's gimbal rotation is some of the most fun I've had testing a product. Well, tied with testing the free-moving gimbal on the Mavic 4 Pro, of course. You can combine gimbal rotation with the Mini 5 Pro's short-form QuickShot videos too, giving you more creative freedom and flexibility.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/MUVuWm_UmqY" allowfullscreen></iframe></div></div><p>4K/60fps HDR is in play, as is 10-bit D-Log M video that captures a wide dynamic range of up to 14-stops for more flexibility while color grading in post. The Mini 5 Pro is the ideal drone for beginners, experienced pilots, and everyone in between. It enables you to get creative without worrying about weight restrictions or whether the drone will return safely to you.</p><p>You can check out more video footage and sample images I took with the drone in my full <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">DJI Mini 5 Pro review here</a>, and check out the differences between the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-vs-dji-mini-4-pro-clear-winner">DJI Mini 5 Pro vs the DJI Mini 4 Pro here</a>.</p><h2 id="if-you-re-in-the-u-s">If you're in the U.S...</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8uTwQqfTZYs965efEktRc8" name="dji_mini_5_pro 16.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/8uTwQqfTZYs965efEktRc8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As I mentioned up top, the DJI Mini 5 Pro, at the time of writing, isn't available in the U.S. but we expect third-party retailers to stock it in the coming weeks or months. But for now, <a href="https://www.tomsguide.com/cameras-photography/drones/the-dji-mini-5-pro-is-here-and-its-amazing-but-it-isnt-available-in-the-u-s-so-what-are-your-alternatives">what are your alternatives</a>? Are there any other drones you can buy? The good news is that there are a plethora of quadcopters out there, ripe for the picking.</p><p>Here are my top three picks if you need a drone to tide you over until you can get your hands on the Mini 5 Pro:</p><div class="product"><a data-dimension112="1284b064-dd27-4104-af6f-f26da735e628" data-action="Deal Block" data-label="DJI Mini 4 Pro" data-dimension48="DJI Mini 4 Pro" data-dimension25="$1157" href="https://www.adorama.com/djim4prorc.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:920px;"><p class="vanilla-image-block" style="padding-top:91.52%;"><img id="22V8eAgz49EotdwXxvR5nJ" name="Screenshot 2025-09-18 at 13.52.30" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/22V8eAgz49EotdwXxvR5nJ.png" mos="" align="middle" fullscreen="" width="920" height="842" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Your first alternative to the DJI Mini 5 Pro is, naturally, its predecessor: the <a href="https://www.tomsguide.com/reviews/5-things-i-like-about-the-dji-mini-4-pro-and-2-things-i-hate" data-dimension112="1284b064-dd27-4104-af6f-f26da735e628" data-action="Deal Block" data-label="DJI Mini 4 Pro" data-dimension48="DJI Mini 4 Pro" data-dimension25="$1157">DJI Mini 4 Pro</a>. This tiny drone packs a punch with its 4K/60fps and 48MP imaging capabilities, omnidirectional obstacle avoidance, and ease of use, and it caters to beginners and experienced flyers. What makes it great is its low-light performance. While it may not be as outstanding and noise-free as the Mini 5 Pro's, it is still relatively grain-free when compared to other mini drones.<a class="view-deal button" href="https://www.adorama.com/djim4prorc.html" target="_blank" rel="nofollow" data-dimension112="1284b064-dd27-4104-af6f-f26da735e628" data-action="Deal Block" data-label="DJI Mini 4 Pro" data-dimension48="DJI Mini 4 Pro" data-dimension25="$1157">View Deal</a></p></div><div class="product"><a data-dimension112="3769c049-01f6-4550-be53-c34637a770dd" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1099" href="https://www.amazon.com/DJI-Controller-Wide-Angle-Omnidirectional-Batteries/dp/B07FVZFX73/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="dvdBuBKqFVm6DVzxaXfGJn" name="DJI-Air-3S-deal-box" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dvdBuBKqFVm6DVzxaXfGJn.jpg" mos="" align="middle" fullscreen="" width="2560" height="2560" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review" data-dimension112="3769c049-01f6-4550-be53-c34637a770dd" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1099">DJI Air 3S</a> belongs in the "prosumer" category so it's slightly detached from the DJI Mini 5 Pro's place in the market, but it's an amazing alternative, featuring the same 1-inch sensor, 4K/60fps video, next-gen obstacle avoidance with forward-facing LiDAR, and more. You can also shoot in 10-bit D-Log M or HLG profiles to preserve a wide dynamic range, as the Air 3S is capable of capturing up to 14 stops of dynamic range.<a class="view-deal button" href="https://www.amazon.com/DJI-Controller-Wide-Angle-Omnidirectional-Batteries/dp/B07FVZFX73/" target="_blank" rel="nofollow" data-dimension112="3769c049-01f6-4550-be53-c34637a770dd" data-action="Deal Block" data-label="DJI Air 3S" data-dimension48="DJI Air 3S" data-dimension25="$1099">View Deal</a></p></div><div class="product"><a data-dimension112="8eae398d-3535-4b97-bb65-d42f04ffe19b" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$479" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" 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:78.13%;"><img id="QEqNG4iNnxL2KBjVQKhum8" name="Potensic-Atom-2-deal" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QEqNG4iNnxL2KBjVQKhum8.jpg" mos="" align="middle" fullscreen="" width="1500" height="1172" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>DJI isn't the only brand making some of the best drones out there, and the <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review" data-dimension112="8eae398d-3535-4b97-bb65-d42f04ffe19b" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$479">Potensic Atom 2</a> gives DJI's lineup of mini drones a run for its money. Video quality takes a slight hit at the Atom 2's is limited to 4K/30fps, but it's still smooth and stable, and colors appear true to life. The Atom 2 also captures 48MP stills, and you get a 3x digital zoom to get stuck in the detail. For shooting at night, the Atom 2 has a dedicated AI Night Video mode which drastically reduces noise.<a class="view-deal button" href="https://www.amazon.com/Potensic-Transmission-Vertical-Shooting-QuickShots/dp/B0DKHCZHCY/" target="_blank" rel="nofollow" data-dimension112="8eae398d-3535-4b97-bb65-d42f04ffe19b" data-action="Deal Block" data-label="Potensic Atom 2" data-dimension48="Potensic Atom 2" data-dimension25="$479">View Deal</a></p></div><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review">I’ve spent three weeks testing the DJI Mini 5 Pro — and it sets a new gold standard for mini drones</a></li><li><a href="https://www.tomsguide.com/us/best-drones,review-2412.html">Best drones in 2025</a></li><li><a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-vs-dji-mini-4-pro-clear-winner">DJI Mini 5 Pro vs DJI Mini 4 Pro — I’ve flown both and there’s a clear winner</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve spent three weeks testing the DJI Mini 5 Pro — and it sets a new gold standard for mini drones ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-review</link>
                                                                            <description>
                            <![CDATA[ The DJI Mini 5 Pro improves on its predecessor by introducing a 1-inch sensor, LiDAR for better obstacle avoidance, better wind resistance, and more. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">mRQeH7z6fBAPAdcnp4bkB3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4Uiqt5CH6yKxG8eVKWTDc8-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Oct 2025 15:30:45 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:30:51 +0000</updated>
                                                                                                                                            <category><![CDATA[Drones]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ nikita.achanta@futurenet.com (Nikita Achanta) ]]></author>                    <dc:creator><![CDATA[ Nikita Achanta ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oXuvixDz99SbZp9z8Uoor3.png ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Nikita is a Senior Writer on the Reviews team at Tom&#039;s Guide. She is a lifelong gaming and photography enthusiast, especially interested in wildlife photography. Having worked as a Sub Editor and Writer for Canon EMEA, she’s a bit of a grammar nerd (and a supporter of the Oxford comma), and has also interviewed photographers from all over the world and working in different genres. A holder of two master’s degrees, the most recent one being in Magazine Journalism from Cardiff University, Nikita’s work has appeared in several publications such as Motor Sport Magazine, NME, Marriott Bonvoy, The Independent, and Metro. Her favorite tech includes the PS5, the DJI Air 3S, and the Fujifilm X-T50. She&#039;s also a licensed drone pilot and cameras expert so you&#039;ll find her testing those nearly every week.&lt;/p&gt;&lt;p&gt;In her downtime, Nikita can usually be found sinking hours into RPGs on her PS5, flying a drone, out on a walk with a camera in hand, at a concert, watching F1, or planning her next tattoo. You can follow her photography account on Instagram&lt;a href=&quot;https://www.instagram.com/photos.bynikita/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt; here&lt;/a&gt;.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4Uiqt5CH6yKxG8eVKWTDc8-1280-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A dark grey DJI Mini 5 Pro drone]]></media:description>                                                            <media:text><![CDATA[A dark grey DJI Mini 5 Pro drone]]></media:text>
                                <media:title type="plain"><![CDATA[A dark grey DJI Mini 5 Pro drone]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4Uiqt5CH6yKxG8eVKWTDc8-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/us/best-drones,review-2412.html">best drones</a> can help take your content creation skills to the next level but they can also be heaps of fun to fly. In recent years, drone videography has become more accessible thanks to mini drones, but these quadcopters usually come with some restrictions, such as not having the best obstacle avoidance or the biggest sensors. Well, the DJI Mini 5 Pro fixes every problem I’ve encountered with mini drones, and it sets a new gold standard.</p><p>When I first flew the Mini 5 Pro a few weeks ago, I instantly fell in love with it, and my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-first-impressions">first impressions</a> told me it could be the drone to beat — and I’m pleased to say I have not been proven wrong after having conducted my battery of tests. It improves on its predecessor by introducing a large 1-inch sensor, forward-facing LiDAR for better obstacle avoidance, a free moving gimbal, all while maintaining a compact size.</p><p>If you’ve been meaning to upgrade or buy your first drone even, your search might be over. To find out why, read my full DJI Mini 5 Pro review.</p><h2 class="article-body__section" id="section-dji-mini-5-pro-review-specs"><span>DJI Mini 5 Pro review: Specs</span></h2><div ><table><thead><tr><th class="firstcol " ><p>Specs</p></th><th  ><p>DJI Mini 5 Pro</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>Starts at <a href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">$1,397</a> / <a href="https://www.amazon.co.uk/DJI-Mini-More-Combo-RC-N3/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">£689</a></p></td></tr><tr><td class="firstcol " ><p><strong>Flight time</strong></p></td><td  ><p>36 minutes</p></td></tr><tr><td class="firstcol " ><p><strong>FAA/CAA registration</strong></p></td><td  ><p>Not required</p></td></tr><tr><td class="firstcol " ><p><strong>Cameras</strong></p></td><td  ><p>One</p></td></tr><tr><td class="firstcol " ><p><strong>Image sensor</strong></p></td><td  ><p>50MP 1-inch CMOS</p></td></tr><tr><td class="firstcol " ><p><strong>ISO</strong></p></td><td  ><p>100-12,800 (Normal) | 100-3200 (D-Log M) | 100-3200 (HLG)</p></td></tr><tr><td class="firstcol " ><p><strong>Shutter speed</strong></p></td><td  ><p>1/8,000s-2s</p></td></tr><tr><td class="firstcol " ><p><strong>Aperture</strong></p></td><td  ><p>f/1.8</p></td></tr><tr><td class="firstcol " ><p><strong>Focus</strong></p></td><td  ><p>0.5m to ∞</p></td></tr><tr><td class="firstcol " ><p><strong>Max video resolution</strong></p></td><td  ><p>4K/60fps, 4K/120fps, FHD/240fps</p></td></tr><tr><td class="firstcol " ><p><strong>Stabilization</strong></p></td><td  ><p>Three-axis mechanical gimbal</p></td></tr><tr><td class="firstcol " ><p><strong>Indoor use</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Propellers</strong></p></td><td  ><p>Four</p></td></tr><tr><td class="firstcol " ><p><strong>Max takeoff altitude</strong></p></td><td  ><p>6000m</p></td></tr><tr><td class="firstcol " ><p><strong>Max flight distance</strong></p></td><td  ><p>13.04 miles (21km)</p></td></tr><tr><td class="firstcol " ><p><strong>Navigation system</strong></p></td><td  ><p>GPS, Galileo, BeiDou</p></td></tr><tr><td class="firstcol " ><p><strong>Collision avoidance</strong></p></td><td  ><p>Omnidirectional with forward-facing LiDAR</p></td></tr><tr><td class="firstcol " ><p><strong>Smartphone control</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Internal storage</strong></p></td><td  ><p>Yes, 42GB</p></td></tr><tr><td class="firstcol " ><p><strong>microSD card slot</strong></p></td><td  ><p>Yes, V30 or higher</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>14.96 x 11.96 x 3.58 inches (unfolded, with propellers)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>8.81oz (249.9g)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-mini-5-pro-review-cheat-sheet"><span>DJI Mini 5 Pro review: Cheat sheet</span></h2><ul><li><strong>What is it? </strong>The successor to the two-year-old DJI Mini 4 Pro</li><li><strong>Who is it for? </strong>For beginners or content creators who want a lightweight drone offering pro-level features</li><li><strong>How much does it cost? </strong>The DJI Mini 5 Pro starts at <a href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">$1,397</a> / <a href="https://www.amazon.co.uk/DJI-Mini-More-Combo-RC-N3/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">£689</a></li><li><strong>What do we like?</strong> The large 1-inch sensor and improved low-light performance, omnidirectional obstacle avoidance with LiDAR, stunning 4K/60fps footage, and so much more</li><li><strong>What don’t we like? </strong>Battery life isn’t vastly different from the DJI Mini 4 Pro’s</li></ul><h2 class="article-body__section" id="section-dji-mini-5-pro-review-price-availability"><span>DJI Mini 5 Pro review: Price & availability</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="epYiNpHjQs4KmWZhHGSHd8" name="dji_mini_5_pro 8.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/epYiNpHjQs4KmWZhHGSHd8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Launched on 17 September 2025, the DJI Mini 5 Pro has a retail price of <a href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">$1,397 at Amazon U.S.</a> / <a href="https://www.amazon.co.uk/DJI-Mini-More-Combo-RC-N3/dp/B0F6XJ7W9M/" target="_blank" rel="nofollow">£689 at Amazon U.K.</a> for the drone and the RC-N3 controller. That price jumps up to <a href="https://www.amazon.co.uk/DJI-Mini-More-Combo-RC-N3/dp/B0F6W94FL4/" target="_blank" rel="nofollow">£869</a> if you get the RC-N3 Fly More combo or to <a href="https://www.amazon.com/DJI-Beginners-Obstacle-ActiveTrack-Rotation/dp/B0F6XN1J7K/" target="_blank" rel="nofollow">$1,708</a> / <a href="https://store.dji.com/uk/product/dji-mini-5-pro-fly-more-combo-dji-rc2/" target="_blank" rel="nofollow">£979</a> for the RC 2 combo, both of which include two additional Intelligent Flight Batteries, a two-way charging hub, a shoulder bag, and an ND filter set.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="8uTwQqfTZYs965efEktRc8" name="dji_mini_5_pro 16.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/8uTwQqfTZYs965efEktRc8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Alas, the Mini 5 Pro isn’t available directly through DJI. According to a DJI representative: “DJI remains dedicated to the U.S. market and is optimizing our strategy to best serve our customers amidst evolving local conditions.” This was also the case with the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mavic-4-pro-review">DJI Mavic 4 Pro</a> ($2,699) when it first came out back in May, but recently, it has become available through third-party retailers, just like the Mini 5 Pro.</p><p>The Mini 5 Pro is priced the same as its predecessor, the <a href="https://www.tomsguide.com/reviews/5-things-i-like-about-the-dji-mini-4-pro-and-2-things-i-hate">DJI Mini 4 Pro</a>, making it a formidable and accessible upgrade. It’s pricier than the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-flip-review">DJI Flip</a> ($439) and the <a href="https://www.tomsguide.com/cameras-photography/drones/potensic-atom-2-review">Potensic Atom 2</a> ($329) but it offers a lot more in terms of shooting capabilities and stabilization, making it ideal for enthusiasts and content creators.</p><h2 class="article-body__section" id="section-dji-mini-5-pro-review-design"><span>DJI Mini 5 Pro review: Design</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qwt8pcM9389gD6QLN9aZd8" name="dji_mini_5_pro 9.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/Qwt8pcM9389gD6QLN9aZd8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The DJI Mini 5 Pro is what you’d get if the <a href="https://www.tomsguide.com/cameras-photography/drones/dji-air-3s-review">DJI Air 3S</a> ($1,099) and the DJI Mavic 4 Pro had a baby. Instead of sporting a light grey color like its predecessor, the Mini 5 Pro is wrapped in a darker shade which makes it look more premium, in my opinion. The drone’s gimbal cover low-key resembles the Mavic 4 Pro’s too. It has a strap that hooks onto the rear vents, securely holding the propeller blades in place.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NkEFJDZFZdwyUeA2CGzMb8" name="dji_mini_5_pro 2.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/NkEFJDZFZdwyUeA2CGzMb8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There’s another similarity between the Mini 5 Pro and the Mavic 4 Pro: both drones’ rear propeller arms don’t have legs to stand on. The front propeller arms’ legs keep the drone steady for takeoff, and the lack of rear legs enables the drone to land more easily on uneven surfaces — or when you don’t have enough surface area to land on.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6uiMryMcw894qZbpAR6Rd8" name="dji_mini_5_pro 10.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/6uiMryMcw894qZbpAR6Rd8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As its name suggests, the Mini 5 Pro is a mini quadcopter, measuring just 14.96 x 11.96 x 3.58 inches (unfolded, with propellers), and it becomes even more compact when its propellers are folded, making it easy to travel with. It isn’t very heavy either, weighing 8.81oz / 249.9g when using an Intelligent Flight Battery, which makes it a Class C0 drone.</p><p>Insert an Intelligent Flight Battery Plus and that pushes it into Class C1 where more restrictions apply. You can read a detailed <a href="https://www.easa.europa.eu/en/domains/drones-air-mobility/operating-drone/open-category-low-risk-civil-drones" target="_blank" rel="nofollow">comparison between the different classes here</a>. DJI has included C0 and C1 stickers in the box so just stick the appropriate one to the drone before you go flying. So while it isn’t necessary to register the drone with the F.A.A. in the U.S. or the C.A.A. in the U.K., I’d recommend doing so anyway so that you can fly the drone legally should you get an Intelligent Flight Battery Plus.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/jCYa5XNk6rvvua7RN54Ge8.jpg" alt="A dark grey DJI Mini 5 Pro drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ndseQruSYNZR9zaTLe3ke8.jpg" alt="A dark grey DJI Mini 5 Pro drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/DVUbirJxguz9x3bg2jFMd8.jpg" alt="A dark grey DJI Mini 5 Pro drone" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Included in the Mini 5 Pro’s Fly More box is a shoulder bag which has plenty of room for storing the drone, charging hub, controller, spare propellers and more. I even stuffed my <a href="https://www.tomsguide.com/reviews/nintendo-switch">Nintendo Switch</a> in there to see if I could carry the bag with ease — and I could!</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mCbVyuNudExZYzfwuf7ic8" name="dji_mini_5_pro 5.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/mCbVyuNudExZYzfwuf7ic8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As for build quality, it’s solid and I can tell the drone is built well when I tap my nails against it. I expect nothing less from DJI. Overall, the Mini 5 Pro knocks it out of the park with its design… and its features, so let’s talk about them next.</p><h2 class="article-body__section" id="section-dji-mini-5-pro-review-features"><span>DJI Mini 5 Pro review: Features</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VDCurZkxuhhSoSzTqxHNb8" name="dji_mini_5_pro 6.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/VDCurZkxuhhSoSzTqxHNb8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The DJI Mini 5 Pro feels like the DJI Mavic 4 Pro’s nephew, having inherited some pro-level specs you don’t always find in mini or sub-250g drones. It packs cutting-edge tech such as advanced safety features, a rotating gimbal, and fantastic wind resistance.</p><p>At 13.04 miles, its flight distance is two miles longer than the DJI Mini 4 Pro’s when using an Intelligent Flight Battery, and this jumps to 19.88 miles versus 15.53 miles when using an Intelligent Flight Battery Plus. Internal storage has received a massive upgrade too, and you now get 42GB of it versus a measly 2GB on the Mini 4 Pro. There’s also a microSD card slot if you want more storage space.</p><h2 id="sensor">Sensor</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nYH7Vc8zxrP23HZykg4ic8" name="dji_mini_5_pro 4.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/nYH7Vc8zxrP23HZykg4ic8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>One of the biggest differences between the Mini 5 Pro and the Mini 4 Pro is the camera’s sensor size. While its predecessor hosted a smaller 1/1.3-inch CMOS sensor, the Mini 5 Pro boasts a larger 1-inch CMOS sensor. The bigger sensor means you now get improved low-light performance with reduced noise and a wider dynamic range. This, in fact, is the largest sensor on a mini drone yet. For context, the Potensic Atom 2 has a 1/1.2-inch sensor and the DJI Flip has a 1/1.3-inch sensor.</p><p>The lens’ maximum aperture has narrowed, though, from f/1.7 on the Mini 4 Pro to f/1.8 but the difference is fairly negligible. There’s a fairly wide ISO range available when you’re shooting video too: 100-12,800 in Normal mode, 100-3200 in D-Log M and HLG. The Mini 5 Pro can capture 50MP stills as opposed to the Mini 4 Pro being able to capture 48MP ones only. You get a variable shutter speed of 1/8,000s-2s and the added ability to capture RAW photos for more flexibility in post-production.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VT58tCJSQaFaHzx2vr4Cc8" name="dji_mini_5_pro 3.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/VT58tCJSQaFaHzx2vr4Cc8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Video specs remain fairly similar with both the Mini 4 Pro and the Mini 5 Pro being able to record 4K/60fps footage. The Mini 5 Pro can shoot slow-mo 4K footage at 120fps (versus 100fps on the Mini 4 Pro) and FHD slow-mo is bumped up to 240fps (versus 200fps on the Mini 4 Pro). For a detailed comparison between the two drones, check out my <a href="https://www.tomsguide.com/cameras-photography/drones/dji-mini-5-pro-vs-dji-mini-4-pro-clear-winner">Mini 5 Pro vs. Mini 4 Pro face-off</a>.</p><h2 id="gimbal-2">Gimbal</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MGoy2wwjZHqcNGe6cp4xb8" name="dji_mini_5_pro 11.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/MGoy2wwjZHqcNGe6cp4xb8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The weeks leading up to the Mini 5 Pro’s launch were riddled with rumors and leaks, and the introduction of the 1-inch sensor wasn’t exactly a surprise. However, I didn’t anticipate a big upgrade to the gimbal which DJI kept under wraps. Similar to its very advanced uncle, the Mavic 4 Pro, the Mini 5 Pro features a 225° gimbal which enables flexible and dynamic camera movement as well as wide-angle rotation, giving you lots of creative freedom.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Ww0FITWUldI" allowfullscreen></iframe></div></div><p>This can be paired with the Mini 5 Pro’s Intelligent Flight Modes and QuickShots too for creating mind-blowing footage easily — perfect for content creation. You can enable fluid gimbal movement by holding the C1 button on the controller and moving the right dial. You can see what this looks like in the video above. </p><p>Similar to the DJI Flip and the Potensic Atom 2, the Mini 5 Pro’s three-axis mechanical gimbal keeps footage stable and smooth as you pan, tilt and roll.</p><h2 id="wind-resistance-3">Wind resistance</h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aX_oJOuPdyE" allowfullscreen></iframe></div></div><p>On one of the days when I was testing the Mini 5 Pro, it was extremely windy in the U.K. and my weather app noted the wind was blowing at 21mph. Luckily, the Mini 5 Pro features fantastic wind resistance, rated at 12 m/s or 26.84mph (versus 10.7 m/s or 23.9mph on its predecessor).</p><p>The result? Well, you can see how well the drone handled it in the video above. The Mini 5 Pro held its own and didn't waver, with the resulting footage being stable and smooth. Both the Potensic Atom 2 and the DJI Flip, in comparison, can withstand windy conditions up to 10.7 m/s.</p><p>But of course, if you live by the sea where wind speeds are higher, I’d recommend getting a heavier drone that isn’t susceptible to gusts of wind, such as the DJI Air 3S or the DJI Mavic 4 Pro — both are much more expensive, though.</p><h2 id="obstacle-avoidance-3">Obstacle avoidance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hLWEv29W3dzHyqESsoZZb8" name="dji_mini_5_pro 7.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/hLWEv29W3dzHyqESsoZZb8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>It’s like the list of upgrades never ends! The Mini 5 Pro comes with advanced safety features powered by omnidirectional obstacle avoidance with forward-facing LiDAR and an infrared sensor at the bottom of the aircraft. Both of these make the drone highly capable of either braking in front of or bypassing obstacles even in low-light conditions.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/z1q5cirg4E8" allowfullscreen></iframe></div></div><p>And speaking of, the Mini 5 Pro’s return-to-home feature works exceptionally well in dimly lit environments as it can memorize flight paths more accurately and can do so without GPS, thanks to the larger sensor as well as LiDAR. When I tested this out at nighttime, the drone didn’t struggle at all and promptly returned to where it took off from.</p><h2 class="article-body__section" id="section-dji-mini-5-pro-review-image-quality"><span>DJI Mini 5 Pro review: Image quality</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/o8evz3TKChgFSNfy79xt95.jpg" alt="A photo taken on a DJI Mini 5 Pro drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/8JhvQM66RD7UQj5PdPRuJ5.jpg" alt="A photo taken on a DJI Mini 5 Pro drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/dAfDZaBThSoRnL2edfztM5.jpg" alt="A photo taken on a DJI Mini 5 Pro drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/LoJmRAkuffhd493yMAb3i5.jpg" alt="A photo taken on a DJI Mini 5 Pro drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GpUdbeAKLjo2WZagu3xFV5.jpg" alt="A photo taken on a DJI Mini 5 Pro drone" /><figcaption><small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>Unlike most mini drones, the DJI Mini 5 Pro features a large 1-inch sensor, which means it’s capable of capturing more light and creating brighter images with improved color accuracy. It captures detailed 50MP stills, and you can see a few sample images in the gallery above. Greens are vivid and lots of detail has been captured in the highlights and shadows.</p><p>The drone can take RAW photos too for more creative freedom in post-production but for those who don’t care much about that, straight-out-of-camera JPEGs look gorgeous too.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/4ExSdGD6JECy6iekgPcrfB.jpg" alt="A photo of a person taken on a DJI Mini 5 Pro drone" /><figcaption>1x zoom.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2LRXox2VsMk2vb7RiEWLzB.jpg" alt="A photo of a person taken on a DJI Mini 5 Pro drone" /><figcaption>2x zoom.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/7ZZRj7JL26hG6GXgEwx8pB.jpg" alt="A photo of a person taken on a DJI Mini 5 Pro drone" /><figcaption>3x zoom.<small role="credit">Nikita Achanta / Tom's Guide</small></figcaption></figure></figure><p>You also get access to a 2x and 3x digital zoom when shooting images. To demonstrate the difference, I stood in the same spot and took three photos, as can be seen in the gallery above (1x, 2x and 3x). There’s a minute loss in detail at 3x zoom (third slide), as the edges of my jacket appear a bit fuzzy, but the photo isn’t unusable at all.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:8192px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="ParQbLCsGzWraVp4KqPf25" name="DJI-Mini-5-Pro-sample-2.JPG" alt="A photo taken on a DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/ParQbLCsGzWraVp4KqPf25.jpg" mos="" align="middle" fullscreen="1" width="8192" height="4608" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/ParQbLCsGzWraVp4KqPf25.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Nikita Achanta / Tom's Guide)</span></figcaption></figure><p>Low-light performance is stellar too. The city lights in the photo above have been captured well, and I like that the red light atop the crane isn’t blown out. I love that you can see the dark clouds’ outlines too. Grain doesn’t ruin the photo either, as it does when using a drone with a smaller sensor, such as the DJI Flip with its 1/1.3-inch sensor.</p><h2 class="article-body__section" id="section-dji-mini-5-pro-review-video-quality"><span>DJI Mini 5 Pro review: Video quality</span></h2><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iVSrVbW87p0" allowfullscreen></iframe></div></div><p>The DJI Mini 5 Pro is a formidable drone when it comes to video quality. As I mentioned up top, it can record 4K/60fps video which looks stunning with faithful color reproduction. You can see sample footage above. I love the vivid greens and the darker shades of blue and black in the water. The water’s movement is smooth and fluid as well, which is gorgeous.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/jUvPz6YwO5Y" allowfullscreen></iframe></div></div><p>Thanks to the rotating gimbal, you can shoot vertical 9x16 video too. This is an added benefit for content creators or enthusiasts who like sharing their videos on, say, Instagram Reels or YouTube Shorts as you don’t need to crop it in post-production.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/tuV1Jrnj77Y" allowfullscreen></iframe></div></div><p>If you’re shooting in 4K, you get a 1x-3x digital zoom, and a 1x-4x digital zoom when shooting in FHD. You, of course, lose some of the finer details in color when zooming in — such as the grass appearing ever-so-slightly yellow in the video above — but it’s nice having the flexibility to do so if you want to capture something in the distance. I appreciate that the text on my jumper is still discernible even when zoomed in at 3x.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/MUVuWm_UmqY" allowfullscreen></iframe></div></div><p>As with most other recent DJI drones, the Mini 5 Pro can shoot in 10-bit 4:2:0 D-Log M, which means it can capture 1.07 billion individual hues and up to 14-stops of dynamic range, giving you more freedom for color grading. The video above shows what the RAW footage looks like.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/21xHiDwFN18" allowfullscreen></iframe></div></div><p>DJI’s array of QuickShot modes — such as Rocket, Follow, Asteroid, etc. — is also available for drone pilots who want to create short videos without thinking too much about composition and framing. The Mini 5 Pro utilizes ActiveTrack 360º to perform movements around subjects, both animate and inanimate. </p><p>I always love playing around with QuickShot modes as they take the guesswork out of aerial videography. As always, the drone returns to its takeoff position once it’s done recording.You can see a couple examples in the compilation above.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/GDJzddtmY3w" allowfullscreen></iframe></div></div><p>As with images, the Mini 5 Pro excels at recording video in low-light environments, thanks to its 1-inch sensor, as you can see in the footage above which isn’t very noisy (aside from the light pollution from the city lights). Also, having advanced obstacle avoidance in the dark helped me fly more confidently, even though I didn’t do any crazy tricks. Having the reassurance that the drone would return to me even if it lost its GPS signal gave me peace of mind.</p><h2 class="article-body__section" id="section-dji-mini-5-pro-review-battery-life"><span>DJI Mini 5 Pro review: Battery life</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="3oQwfPqYmsPJHEp3mn7Wa8" name="dji_mini_5_pro 1.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/3oQwfPqYmsPJHEp3mn7Wa8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>There isn’t a huge difference between the DJI Mini 5 Pro’s and the DJI Mini 4 Pro’s maximum flight times. Using an Intelligent Flight Battery, the Mini 5 Pro can fly for 36 minutes which is only two minutes longer than the Mini 4 Pro. This gets bumped up to 52 minutes versus 45 minutes when using an Intelligent Flight Battery Plus. Battery life will, of course, take a hit depending on the drone’s speed, firmware version, wind conditions and temperature.</p><p>I’ve been using Intelligent Flight Batteries to test the Mini 5 Pro and on a windless day when I was flying the drone away and then back to me, I got approximately 35 minutes between charges which isn’t bad at all. The Mini 5 Pro’s flight time is longer than the DJI Flip’s (31 minutes) and the Potensic Atom 2’s (32 minutes).</p><h2 class="article-body__section" id="section-dji-mini-5-pro-review-verdict"><span>DJI Mini 5 Pro review: Verdict</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4Uiqt5CH6yKxG8eVKWTDc8" name="dji_mini_5_pro 13.JPG" alt="A dark grey DJI Mini 5 Pro drone" src="https://cdn.mos.cms.futurecdn.net/4Uiqt5CH6yKxG8eVKWTDc8.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As mini drones go, the DJI Mini 5 Pro is hard to upstage. Its predecessor was already a highly capable quadcopter, and the Mini 5 Pro does nothing but improve on it. Its 1-inch sensor captures lots of detail to produce bright images, even in low-light conditions. Color reproduction is fantastic in 50MP images as well as 4K/60fps video.</p><p>Obstacle avoidance has received a huge upgrade thanks to forward-facing LiDAR which helps the drone fly in dimly lit environments and return home without GPS. But perhaps my favorite feature is the 225° gimbal which makes footage appear trippy and allows you to get creative. Add the ability to capture up to 14-stops of dynamic range while shooting in D-Log M and you’ve got a beast for content creation. The best part? The Mini 5 Pro remains lightweight and compact.</p><p>The Mini 5 Pro sets a new standard for drone safety and I’m sure its plethora of features will help beginner pilots feel more confident. Right now, there isn’t a better mini drone out there.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the DJI Osmo Nano and it might just be the finest tiny action cam around — here's why ]]></title>
                                                                                                                                                                                                <link>https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-nano-review</link>
                                                                            <description>
                            <![CDATA[ The DJI Osmo Nano offers a blend of pro features and versatility, making it ideal for both low- and high-octane content creation. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">M37n4hHKJfBW3t7h2hwrcY</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GVHRYRcLyjKPkk7e9JNMPh-1280-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 03 Oct 2025 14:40:31 +0000</pubDate>                                                                                                                                <updated>Thu, 26 Mar 2026 10:30:53 +0000</updated>
                                                                                                                                            <category><![CDATA[GoPros &amp; Action Cameras]]></category>
                                                    <category><![CDATA[Cameras &amp; Photography]]></category>
                                                                                                <author><![CDATA[ peter.wolinski@futurenet.com (Peter Wolinski) ]]></author>                    <dc:creator><![CDATA[ Peter Wolinski ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/stgPfXWY7ukw8J8rfC7vjg.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Peter is a Senior Editor at Tom&#039;s Guide, heading up the site&#039;s Reviews team and Cameras section. Having built gaming PCs since he was 10 (that&#039;s a while ago now) he&#039;s a bit of a nerd about components and hardware. He&#039;s also been an iPhone user since the classic iPhone 4, and a Mac user for well over a decade. Experienced in using and testing all kinds of technology — from phones through to tablets, computers, games consoles, cameras and smart home tech — helping people find the best tech for them (at the best prices) is what Peter does best. A photographer since he bought his first camera (a Fujifilm) in 2015, Peter was previously an Editor for Canon-Europe.com. He then edited the Cameras and How To sections of Tom&#039;s Guide. When he&#039;s not crafting helpful, in-depth reviews, Peter can usually be found out and about honing his architectural photography skills, riding his motorcycle around Welsh mountain roads, telling everyone about his two greyhounds, squeezing a few extra FPS out of PC games or perfecting his espresso shots.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/GVHRYRcLyjKPkk7e9JNMPh-1280-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[DJI Osmo Nano against a blue background]]></media:description>                                                            <media:text><![CDATA[DJI Osmo Nano against a blue background]]></media:text>
                                <media:title type="plain"><![CDATA[DJI Osmo Nano against a blue background]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GVHRYRcLyjKPkk7e9JNMPh-1280-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>At last! A rival suitor has finally arrived. The small action cameras market has, from time immemorial, been bequeathed to Insta360 Go’s line. Now, long overdue, a fearless champion steps into the fray to tourney for the coveted title. What, then, does our rival champion look like? Step forward, DJI Osmo Nano!</p><p>Oh. It’s… it’s hideous.</p><p>OK, well nevermind. Verily, ‘tis what our brave (if malformed) champion hath inside that matters. And those features are indeed more comely. 4K moving tapestries at 60 frameths per second! A lightweight thumb camera to sit atop thine bascinet, clip to thine hunting dog’s collar, or strap to thine heir’s infant head! And it’ll cost you fewer groats than an <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-go-ultra-review">Insta360 Go Ultra</a>, too. Much fewer.</p><p>I’ll stop messing around now, primarily because there’s no way I can <em>weave</em> 10-bit color and D-Log M into this already laborious medieval metaphor. But hey, it has those as well. And more. Quite a bit more.</p><p>Could this be the new <a href="https://www.tomsguide.com/us/best-action-cameras,review-3046.html"><u>best small action camera</u></a> around? Read my full DJI Osmo Nano review to find out.</p><h2 class="article-body__section" id="section-dji-osmo-nano-review-specs"><span>DJI Osmo Nano review: Specs</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Starting price</strong></p></td><td  ><p>From <a href="https://www.amazon.com/DJI-Osmo-Nano-Standard-Combo/dp/B0FBFZM45S" target="_blank" rel="nofollow"><u>$299</u></a> / <a href="https://www.amazon.co.uk/DJI-6937224115453-Osmo-Action-2/dp/B0FBFZM45S" target="_blank" rel="nofollow"><u>£239</u></a></p></td></tr><tr><td class="firstcol " ><p><strong>Max video resolution</strong></p></td><td  ><p>4K/60fps</p></td></tr><tr><td class="firstcol " ><p><strong>Sensor size</strong></p></td><td  ><p>1/1.3-inch</p></td></tr><tr><td class="firstcol " ><p><strong>Screen</strong></p></td><td  ><p>1.96-inch touchscreen</p></td></tr><tr><td class="firstcol " ><p><strong>Internal memory</strong></p></td><td  ><p>64GB / 128GB</p></td></tr><tr><td class="firstcol " ><p><strong>MicroSD slot</strong></p></td><td  ><p>Yes</p></td></tr><tr><td class="firstcol " ><p><strong>Pre-recording</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Loop recording</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Live streaming</strong></p></td><td  ><p>No</p></td></tr><tr><td class="firstcol " ><p><strong>Connectivity</strong></p></td><td  ><p>Bluetooth, Wi-Fi, USB-C</p></td></tr><tr><td class="firstcol " ><p><strong>Water resistance</strong></p></td><td  ><p>Camera: 33 feet | Vision Dock: IPX4</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>Camera: 500mAh</p><p>Action Pod: 1,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>Camera: 2.2 x 1.1 x 1.1 inches</p><p>Vision Dock: 2.3 x 1.9 x 1.3 inches</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>Camera: 1.8 ounces</p><p>Vision Dock: 2.5 ounces</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-dji-osmo-nano-review-price-availability"><span>DJI Osmo Nano review: Price & availability</span></h2><p>The DJI Osmo Nano is available in two guises based on internal storage. The 64GB version costs <a href="https://www.amazon.com/DJI-Osmo-Nano-Standard-Combo/dp/B0FBFZM45S" target="_blank" rel="nofollow"><u>$299 at Amazon</u></a>, while the 128GB version costs <a href="https://www.amazon.com/DJI-Osmo-Nano-Standard-Combo/dp/B0DYD56G2Y/" target="_blank" rel="nofollow"><u>$329 at Amazon</u></a>. In the U.K., that’s <a href="https://www.amazon.co.uk/DJI-6937224115453-Osmo-Action-2/dp/B0FBFZM45S" target="_blank" rel="nofollow"><u>£239</u></a> and <a href="https://www.amazon.co.uk/DJI-6937224115453-Osmo-Action-2/dp/B0DYD56G2Y" target="_blank" rel="nofollow"><u>£259</u></a> respectively.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/cuETRjYCVnyZEFHQUua6Th.jpg" alt="DJI Osmo Nano next to the Insta360 Go Ultra" /><figcaption>The DJI Osmo Nano (right) next to the Insta360 Go Ultra (left)<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/cwjTb6rg3wo6oMogK2ZsTh.jpg" alt="DJI Osmo Nano next to the Insta360 Go Ultra" /><figcaption>The DJI Osmo Nano (right) next to the Insta360 Go Ultra (left)<small role="credit">Future</small></figcaption></figure></figure><p>$299 massively undercuts the Nano’s only real rival, the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-go-ultra-review">Insta360 Go Ultra</a> ($449), which retails for $449. Both offer 4K/60p and a ‘mount anywhere’ approach. While the Go Ultra has the upper hand regarding microphones, battery life and general overall form factor, the Osmo Nano has better stabilization, more pro features and its thumb camera in isolation has a more usable form factor. Overall, the Osmo Nano comes out on top in my book, especially given the cost saving.</p><h2 id="u-s-availability">U.S. availability</h2><p>DJI’s ongoing battle with the U.S. government means that, as with all recent DJI products, the Osmo Nano is not officially sold in the States (meaning not sold via DJI’s store). However, third party retailers are already stocking it — like Amazon.</p><p>This means you can't purchase a DJI Care package for the Nano. So, if yours gets broken, you may not be able to have it fixed without serious cost implications. This is less of an issue with the Osmo Nano — which uses screw-on lens covers — than on other cameras with fragile lenses like the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-360-review"><u>DJI Osmo 360</u></a> ($549). But worth bearing in mind.</p><h2 class="article-body__section" id="section-dji-osmo-nano-review-design-controls"><span>DJI Osmo Nano review: Design & controls</span></h2><p>The Osmo Nano’s overall form factor is a little odd, to say the least. Similar to the Insta360 Go line, the Nano takes a modular approach by combining a tiny thumb camera with a second unit, which hosts a screen, ports and a second (bigger) battery — on the Nano this is called a “Vision Dock” while the Insta360 Go Ultra uses an “Action Pod.”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="vkrRnq9nUHvKWriSrk9DRh" name="dji_osmo_nano_ 1.JPG" alt="DJI Osmo Nano against a blue background" src="https://cdn.mos.cms.futurecdn.net/vkrRnq9nUHvKWriSrk9DRh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Insta360’s form factor makes sense — the tiny camera sits <em>inside</em> the Action Pod, and the whole unit resembles a typical action camera. The Nano, however, sits awkwardly on top of its Vision Dock, which itself sits awkwardly on top of a quick release mount if you want to, y’know, put it on anything.</p><p>The result is an overly tall and far from prepossessing combined unit, which not only looks silly when mounted, but can make the whole unit difficult to mount in the first place. In its entirety, it’s too tall and lanky to be mounted on a helmet chin mount, for instance, whereas the Go Ultra inside its Action Pod has no issues (it’s effectively a normally-proportioned action camera, after all).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1948px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="cpeRUaW7gbMdnSPYxQAtUa" name="dji_osmo_nano_ 8_16-9" alt="DJI Osmo Nano in hand on a selfie stick" src="https://cdn.mos.cms.futurecdn.net/cpeRUaW7gbMdnSPYxQAtUa.jpg" mos="" align="middle" fullscreen="" width="1948" height="1096" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While the Nano’s overall form factor is gangly when combined with its Vision Dock, the tiny oblong Nano camera itself is more usable than the Go Ultra’s square one. Its stout oblong shape makes the Nano much easier to mount, suffers from less drag and has a lower center of gravity — this makes it more stable on cap peaks and stops it getting flung off its magnetic mounts as easily as the Go Ultra.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/9SQNDwr5fsLfUsUW2PdAUh.jpg" alt="DJI Osmo Nano on a cap peak" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hZ5kLBaqDg7AkeeRGcLkWh.jpg" alt="DJI Osmo Nano on a neck pendant" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/3cgLAu5neXU5BeYeg6MBYh.jpg" alt="DJI Osmo Nano on a neck pendant" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The Vision Dock weighs 2.5 ounces (72g) — over an ounce lighter than the Go Ultra’s 3.8 ounce Action Pod. Really, though, what matters is the weight of the thumb camera, as that’s the only thing being mounted in delicate places like cap peaks. The Osmo Nano thumb camera weighs 1.8 ounces or 52g, the same as the Go Ultra’s (give or take a half a gram or so). So nothing in it.</p><h2 id="display">Display</h2><p>The Osmo Nano’s display is a 1.96-inch touchscreen, which is bright, responsive and (just about) big enough for ease-of-use when navigating menus (more on that later). It’d be a misnomer to call it a rear screen, firstly because it’s… under the Nano camera. But also because it can be used facing forward or backward. Rotate the Vision Dock 180-degrees so the display is front-facing and you have a selfie screen!</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PfyR77etuNNtjbK5j2YeVh" name="dji_osmo_nano_ 13.JPG" alt="DJI Osmo Nano in hand next to the Insta360 Go Ultra" src="https://cdn.mos.cms.futurecdn.net/PfyR77etuNNtjbK5j2YeVh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I still prefer the flip-up display of the Go Ultra. If you want to switch from ‘behind the camera’ to selfie-style vlogging shots, on the Go Ultra you need simply flip up the display and turn the camera — doable without minimal interruption to recording. On the Osmo Nano, you’ll need to unclip the Vision Pod, rotate it 180-degrees, clip it back in and then flip your camera around. It’s messy and will almost certainly require cuts in post-production.</p><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="KwmqgDJgTitQrx6XiAxgyG" name="Osmo Nano in hand" alt="The DJI Osmo Nano display in hand being used as a remote control" src="https://cdn.mos.cms.futurecdn.net/KwmqgDJgTitQrx6XiAxgyG.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>All that said, the Nano’s Vision Dock is fantastic to use as a remote screen/control when detached from the camera (they communicate wirelessly with one another). It’s tiny, so it can just sit in your palm or pocket as you shoot. You can do this with the Go Ultra’s Action Pod, too, but it’s a lot larger and more annoying to carry/pocket.</p><h2 id="controls-3">Controls</h2><p>The Nano’s onboard buttons are very scant. There are two record buttons which also serve as power buttons — a little confusing when you first pick up the camera.</p><p>All control is realistically meant to happen via the screen, which is a little too small for the chubby-fingered like myself. The Go Ultra’s display is much more spacious, making menus and sub-menus much easier to navigate.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="VXs6JJZE5ESJHrVj4BvMTh" name="dji_osmo_nano_ 4.JPG" alt="DJI Osmo Nano against a blue background" src="https://cdn.mos.cms.futurecdn.net/VXs6JJZE5ESJHrVj4BvMTh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>DJI’s menu system is comprehensive, sensibly laid out and will be familiar to anyone that’s used a recent DJI device.</p><p>My only major gripe with the control system is the status light on the Nano camera. There’s only one, and it’s on the front. That means if you’re shooting anything but selfie-style footage, then you’ll have no idea whether the Nano camera (when off the Vision Dock) is recording or not. I was having to crane my head over the camera to look down and see the status light. An awful UX.</p><h2 id="mounting-2">Mounting</h2><p>The Osmo Nano uses both magnetic and clip mounting. The bottom of both the Nano camera and Vision Dock features a clip bracket for attaching to quick release mounts. This is the same system as used by the <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/dji-osmo-action-5-pro-review"><u>DJI Osmo Action 5 Pro</u></a> ($349) and Osmo 360, so your existing DJI accessories will work for the Nano! Awesome in its own right, but especially when compared to the Go Ultra, which also uses a proprietary mount, but one that is not backwards-compatible with other Insta360 products.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jWXqNygVoKTu6AEmxMRxQh" name="dji_osmo_nano_ 5.JPG" alt="DJI Osmo Nano against a blue background" src="https://cdn.mos.cms.futurecdn.net/jWXqNygVoKTu6AEmxMRxQh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The magnetic system is very handy for attaching to metal objects or the supplied neck pendant, although many of the interesting mounts, such as the cap peak and headband, actually use the quick release clip — this is much more secure during intense movement, so I prefer it. This is again a benefit of the shorter, oblong Nano camera profile versus the square Go Ultra — the squat profile allows space to use the quick release clip rather than having to rely on a magnet.</p><h2 id="waterproofing">Waterproofing</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="QVZS8n6Q2F6Y2t9tRtozQh" name="dji_osmo_nano_ 2.JPG" alt="DJI Osmo Nano against a blue background" src="https://cdn.mos.cms.futurecdn.net/QVZS8n6Q2F6Y2t9tRtozQh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Osmo Nano camera is waterproof down to 33 feet / 10 meters, while the Vision Dock is IPX4 splashproof — both matching the Go Ultra’s waterproofing. If you want to shoot the odd clip underwater, the Nano camera is fine, just disconnect it from the Vision Dock first. </p><p>If you want to film underwater regularly, I’d recommend the Osmo Action 5 Pro, which has a 65-foot waterproof rating and a bigger battery than the Nano camera alone so you can record for longer.</p><h2 id="connectivity-storage">Connectivity & storage</h2><p>The Osmo Nano features a USB-C port for charging and wired data transfer, as well as Bluetooth and 2.4GHz Wi-Fi for wireless connectivity and data transfer.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PcQLD843mYxPBuRkVSCgTh" name="dji_osmo_nano_ 7.JPG" alt="DJI Osmo Nano with its side hatch open against a blue background" src="https://cdn.mos.cms.futurecdn.net/PcQLD843mYxPBuRkVSCgTh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Inside the Vision Dock you’ll find a MicroSD card slot (up to 1TB cards supported), but there’s also internal storage — a major win over rivals. The <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/insta360-go-3s-review"><u>Insta360 Go 3S</u></a> ($399) only has internal storage, while the Go Ultra only has SD storage. Having both on the Nano gives you that extra peace of mind should you fill a card.</p><p>Annoyingly, you can’t record directly to the SD card. You have to record to the internal memory and then transfer files to the SD via an on-screen button. This takes absolutely ages for larger file dumps (100GB took over 20 minutes) and is very frustrating. For this reason, I would recommend the 128GB model so you can space out transfers to SD. That said, still make sure you offload regularly in small batches to minimize downtime.</p><h2 class="article-body__section" id="section-dji-osmo-nano-review-stabilization"><span>DJI Osmo Nano review: Stabilization</span></h2><p>DJI’s RockSteady stabilization is often hit or miss — on some cameras, like the Osmo Action 5 Pro, it’s great. On others, like the Osmo 360, it’s not as impressive.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/Lb4njhQJ4_4" allowfullscreen></iframe></div></div><p>On the Nano, it’s very strong. This camera is designed primarily for family-friendly pursuits, and it does a fine job of stabilizing lower-octane walking footage. The easiest type of walking footage to stabilize is with the camera strapped to a cap peak, where there’s less motion. However, the Osmo Nano also does a great job of stabilizing footage with the camera strapped to a magnetic neck pendant, which tends to be more jerky, as in the video above.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/slhykCNF6WI" allowfullscreen></iframe></div></div><p>It does an excellent job of stabilizing (as much as possible) more active footage, such as when strapped to my dog’s collar, as you can see above.</p><p>When shooting high-octane footage, like the motorcycling clip in the Audio section below, the bumps in the road and lean angles have been smoothed out nicely too.</p><p>The Nano’s stabilization is comparable with the Go Ultra’s. That is to say, both are excellent.</p><h2 class="article-body__section" id="section-dji-osmo-nano-review-video-quality"><span>DJI Osmo Nano review: Video quality</span></h2><p>The DJI Osmo Nano shoots 4K at up to 60fps. The only other tiny action camera to do so is the Go Ultra, as the Go 3S and <a href="https://www.tomsguide.com/cameras-photography/gopro-action-cameras/gopro-hero-2024-review"><u>GoPro Hero</u></a> ($199) top out at 4K/30fps. This makes the Osmo Nano and Go Ultra much better for fast-paced content such as motovlogging, skiing etc, as 60fps will smooth out motion and cause less motion blur than 30fps.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/iCTrZaV6Keg" allowfullscreen></iframe></div></div><p>Footage looks beautiful and sharp. As always, DJI doesn’t offer multiple color profiles, but the base profile looks excellent — lifelike yet vivid. Interestingly, in the <a href="https://www.dji.com/downloads/djiapp/dji-mimo"><u>DJI Mimo</u></a> app, you can apply quick color grades to your footage, so if you do want a stylized look, it’s possible without needing to fire up DaVinci Resolve.</p><p>Importantly, the Osmo Nano features some advanced color features that will likely make it the more appealing option for pros when compared to Insta360 cameras — a common theme in all DJI gear. There’s 8-bit or 10-bit color, the latter capturing a wider color gamut for greater flexibility in post. There’s also D-Log M for wide dynamic range capture (up to 13.5 stops).</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3712px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tXXs2E4SdTBaGWSwhgRAzN" name="DJI Osmo Nano Stills.JPG" alt="A still photo of a green park and path taken on the DJI Osmo Nano" src="https://cdn.mos.cms.futurecdn.net/tXXs2E4SdTBaGWSwhgRAzN.jpg" mos="" align="middle" fullscreen="1" width="3712" height="2088" attribution="" endorsement="" class="expandable"><a href='https://cdn.mos.cms.futurecdn.net/tXXs2E4SdTBaGWSwhgRAzN.jpg' target='_blank' class='expand-button icon-expand-image icon' ></a></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Osmo Nano also takes 35MP stills, as you can see above. Again, they look nice and sharp, but this isn't a photography camera. The lenses are designed to be tough and replaceable rather than the pinnacle of optical sharpness — hence the lens flares.</p><h2 id="low-light-3">Low light</h2><p>The Osmo Nano uses a 1/1.3-inch sensor, which is slightly smaller than the Go Ultra’s 1/1.28-inch sensor, theoretically putting the Osmo Nano on the backfoot for low-light performance.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/McsKEqsdK0g" allowfullscreen></iframe></div></div><p>However, the Osmo Nano's low light footage is fairly clean in dim light. As you can see in the video above, I used the Nano to film some 'Groom's Eye View' footage at my wedding on the dimly lit dance floor and I think it looks great (I had to remove the audio for copyright reasons). Yes: I tested this camera at my own wedding — that right there is commitment to the cause!</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/3WbNvu8wXlM" allowfullscreen></iframe></div></div><p>In super low light, though, footage looks pretty grainy, but it isn't too bad. The Go Ultra's footage in similar conditions is slightly better, but there really isn't much in it.</p><h2 class="article-body__section" id="section-dji-osmo-nano-review-audio-quality"><span>DJI Osmo Nano review: Audio quality</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aYoYhbxFtdLHs35PotTaMh" name="dji_osmo_nano_ 3.JPG" alt="DJI Osmo Nano against a blue background" src="https://cdn.mos.cms.futurecdn.net/aYoYhbxFtdLHs35PotTaMh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The DJI Osmo Nano features two internal microphones, both of which are fairly competent in low-volume environments. You can hear in the footage below how well the camera picked up the gentle sound of the stream and my dog drinking.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/9-U1TzkNNRI" allowfullscreen></iframe></div></div><p>Of course, it’s possible to hook up DJI wireless microphones such as the <a href="https://www.tomsguide.com/audio/dji-mic-mini-review"><u>DJI Mic Mini</u></a> ($59) and DJI Mic 3 ($99) for much clearer sound, especially if you’re recording vocals. Wireless connection uses OsmoAudio, which ostensibly uses Bluetooth. Performance is subsequently on par with Bluetooth — that is to say, not very good — so I wouldn’t recommend this for loud environments.</p><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/nLFqujQzjAw" allowfullscreen></iframe></div></div><p>With no wired microphone interface, you’ll need to rely on internal mics for loud environments, such as motovlogging. The Nano’s built-in Wind Reduction algorithm is pretty good, mostly reducing destructive wind noise in the video clip above. It has, however, cut the noise of the engine, too. The Go Ultra’s internal wind reduction system is much better.</p><p>With no wired microphone interface, the best way to record audio in very loud situations such as motorcycling is to record separately with a decent microphone using 32-bit float recording and sync up audio and video in post.</p><h2 class="article-body__section" id="section-dji-osmo-nano-review-smartphone-app"><span>DJI Osmo Nano review: Smartphone app</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4800px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="K9SNXkL6zShCuBKqns42wG" name="DJI Osmo Nano — DJI Mimo App" alt="Two screenshots of the DJI Mimo app in use, on a colorful background" src="https://cdn.mos.cms.futurecdn.net/K9SNXkL6zShCuBKqns42wG.jpg" mos="" align="middle" fullscreen="" width="4800" height="2700" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: DJI / Tom's Guide)</span></figcaption></figure><p>DJI has made big progress with its <a href="https://www.dji.com/downloads/djiapp/dji-mimo"><u>Mimo</u></a> smartphone app, and it’s now an excellent tool for quickly offloading and editing video files. It gives you lots of control over editing, with trimming, exposure, filters and some basic effects. There’s also a remote control function for live viewing as you record.</p><p>It’s still not quite as feature-packed and user-friendly as the Insta360 app, but there’s really not a lot in it anymore.</p><h2 class="article-body__section" id="section-dji-osmo-nano-review-battery-life-thermal-performance"><span>DJI Osmo Nano review: Battery life & thermal performance</span></h2><p>The Osmo Nano features a 500mAh battery with a 1,300mAh battery in the Vision Dock. In my standard indoor stress test at 4K/60p, the Nano achieved 102 minutes overall. The Go Ultra achieved 110 minutes. This figures, given the Osmo Nano’s slightly smaller total battery capacity, and it’s still a great show from the Nano.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="w9eRdxPZtZJZQM4Z8tDVRh" name="dji_osmo_nano_ 6.JPG" alt="DJI Osmo Nano with its side hatch open against a blue background" src="https://cdn.mos.cms.futurecdn.net/w9eRdxPZtZJZQM4Z8tDVRh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Thermal performance isn’t great, though, with the camera overheating every 24 to 26 minutes. The Go Ultra, meanwhile, shot all 110 minutes without overheating.</p><p>That said, while this is a family-friendly camera, it’s still designed to be used outside and while moving. In real world usage along those lines, overheating shouldn’t be an issue. This is especially true when moving quickly during running, skiing, cycling, motorcycling etc.</p><h2 class="article-body__section" id="section-dji-osmo-nano-review-verdict"><span>DJI Osmo Nano review: Verdict</span></h2><p>The DJI Osmo Nano isn’t perfect. Its form factor is a little weird, its storage system is frustrating and its low-light performance isn’t the best.</p><p>However, the Osmo Nano sits among a new generation of tiny 4K/60p-capable action cameras — devices that are capable not only of capturing family-friendly content at 30fps, but serious, perhaps even professional content at 4K/60p too. Delivering that in packages as small as the Osmo Nano and Insta360 Go Ultra is no mean feat, and always comes with some level of compromise, at least with today’s technology.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GVHRYRcLyjKPkk7e9JNMPh" name="dji_osmo_nano_.JPG" alt="DJI Osmo Nano against a blue background" src="https://cdn.mos.cms.futurecdn.net/GVHRYRcLyjKPkk7e9JNMPh.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class=""></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>With that in mind, among this new generation, the Nano is the best all-rounder and the best value for money by far. Much, <em>much </em>cheaper than the Insta360 Go Ultra, the Nano boasts equally good stabilization and video, a more versatile thumb camera and better mounting options, not to mention professional features like D-Log M and 10-bit color. While the microphones and battery life can’t quite compete with the Go Ultra, they certainly aren’t far off, nor are they bad by any means.</p><p>If you need a versatile, ‘mount anywhere’ action camera for a wide array of content, right now the Osmo Nano is the best combination of performance and value for money. Looks like we have a new champion.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>