<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:dcterms="http://purl.org/dc/terms/"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:cf="https://www.futureplc.com/rss/content-flags"
>
    <channel>
                    <atom:link href="https://www.tomsguide.com/feeds/tag/samsung-phones" rel="self" type="application/rss+xml" />
                            <title><![CDATA[ Latest from Tom's Guide in Samsung-phones ]]></title>
                <link>https://www.tomsguide.com/phones/android-phones/samsung-phones</link>
        <description><![CDATA[ All the latest samsung-phones content from the Tom's Guide team ]]></description>
                                    <lastBuildDate>Tue, 22 Sep 2026 04:30:00 +0000</lastBuildDate>
                            <language>en</language>
                                <item>
                                                            <title><![CDATA[ 5 things Galaxy Z Fold 9 needs to steal from iPhone Duo — and 2 it shouldn't ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> is ticking all of the right boxes at the moment, wowing just about everyone that's been able to use it ahead of its official release Oct. 23. We still don't know how much of a success the phone will be, especially considering the $2,000 price tag, but you can be sure other phone makers are watching closely — especially Samsung.</p><p>Samsung has been the de-factor king of the foldable phone business for several years. Mainly because, outside of China, the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldables</a> have been limited to Google and Motorola — who haven't exactly put up much of a fight. Apple could finally bring the Galaxy Fold series some serious competition, and if I were Samsung I'd be looking for ways to make my foldables stand out. Even if it means blatantly copying Apple's ideas.</p><p>Here are five things the Galaxy Z Fold 9 should steal from iPhone Duo, and two things it should leave well alone.</p><h2 id="what-z-fold-9-should-steal-from-iphone-duo">What Z Fold 9 should steal from iPhone Duo</h2><h3 class="article-body__section" id="section-under-display-camera"><span>Under display camera</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="Mdj8kozN6J8WNXPhazFQFa" name="iPhone Duo edit 1" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/Mdj8kozN6J8WNXPhazFQFa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Samsung had under-display cameras on the Galaxy Z Fold lineup for four generations, from the <a href="https://www.tomsguide.com/reviews/samsung-galaxy-z-fold-3">Galaxy Z Fold 3</a> to <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-6-review-test-results">Z Fold 6</a>. The quality of those cameras was a little... weak, to say the least, so it's no surprise that Samsung pulled them for the last two generations. But maybe now is the time to bring them back.</p><p>Apple has added an under-display camera to the iPhone Duo's foldable display, though this one isn't designed for selfies. Apple has referred to it as a FaceTime camera, and talked about its use as an aid for video calling. That suggests the quality isn't all that either, but by limiting its use cases (at least in marketing) Apple can avoid the same criticisms as Samsung.</p><p>This means the Z Fold 9 could be the perfect time for Samsung to bring the under-display camera back — and give you more of your screen back. Plus, considering you can already take selfies with the rear cameras and the hole-punch on the cover display, I'd avoid using it as a way to take photos of yourself.</p><h3 class="article-body__section" id="section-s-pen-support"><span>S Pen support</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="JUVSwuTeFABcGUzkRL8WtU" name="Galaxy Z Fold 6 and S Pen.jpg" alt="Samsung Galaxy Z Fold 6 and S Pen" src="https://cdn.mos.cms.futurecdn.net/JUVSwuTeFABcGUzkRL8WtU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The loss of the stylus is one of the things Galaxy foldable fans have been complaining about since the release of <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a>. The stylus requires a special digitizer layer in the display, which was removed in an apparent attempt to reduce thickness. Which isn't a great reason to remove a long-standing feature, especially when it leaves Galaxy foldables feeling a little bit lacking.</p><p>Not only does the<a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it"> iPhone Duo have stylus support, it uses the Apple Pencil USB-C</a> — which is compatible with almost every iPad on sale. There's no special iPhone-exclusive stylus; it's the one a lot of iPad users may already have. The same couldn't be said for past Z Fold models, which needed a special foldable-exclusive stylus designed for the more fragile folding display.</p><p>I felt that the Galaxy Z Fold 8 Ultra was missing out on account of its lost stylus, and the launch of Z Fold 9 would be the perfect opportunity to reintroduce that support. Ideally, it would the form of a stylus that will work across Galaxy devices, including tablets and other phones.</p><h3 class="article-body__section" id="section-ip68-durability"><span>IP68 durability</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="F6qr2SDN3gLqxsmgpqVYsY" name="Fold 8 back 2" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/F6qr2SDN3gLqxsmgpqVYsY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Google was the first foldable phone maker in the U.S. to add IP68 water and dust resistance to foldables with <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Pixel 10 Pro Fold</a>, and Apple has followed its example with iPhone Duo. Galaxy Z Fold 8, on the other hand only has an IP48 rating, which means it's totally exposed to dust — even if it is sealed tight against water.</p><p>Obviously, that's not a good look for Samsung, especially when you consider all the moving parts associated with a foldable hinge. You should be able to take your $1,900 to $2,000 foldable to the beach. So Samsung definitely needs to do better with the Z Fold 9.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><h3 class="article-body__section" id="section-magnetic-wireless-charging-built-in"><span>Magnetic wireless charging built in</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="q4DNX2SeEFU5sCTTt45wEa" name="iphone duo edit 5" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/q4DNX2SeEFU5sCTTt45wEa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One of the things I'll never understand is why Samsung is so <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-may-skip-adding-qi2-to-the-galaxy-s26-ultra-and-i-think-theyve-made-the-right-call">seemingly against adding magnetic wireless charging</a> to its phones — foldables included. The phones support Qi2 wireless charging technology, but they lack the integrated magnets that let chargers and accessories snap into place.</p><p>One reason I was given was that<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-may-skip-adding-qi2-to-the-galaxy-s26-ultra-and-i-think-theyve-made-the-right-call"> the magnets interfered with the S Pen</a>, and Samsung couldn't offer both. But considering the iPhone Duo has Apple Pencil support and MagSafe, it's clear that there is a way to offer both features without asking users to compromise. Because a magnetic case system is just a poor show for a phone company that sells devices for close to two thousand dollars.</p><h3 class="article-body__section" id="section-an-actual-vapor-chamber"><span>An actual Vapor Chamber</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:3330px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tgL6AweqbNKzVVmQctz95Z" name="Galaxy Z Fold 8 review-22" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/tgL6AweqbNKzVVmQctz95Z-1920-80.jpg" mos="" align="middle" fullscreen="" width="3330" height="1873" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Snapdragon 8 Elite Gen 5 for Galaxy chipset is powerful. But the phones that use it can get quite hot, and a lack of cooling can lead to worse sustained performance.That's why Samsung needs to add a vapor chamber, much like the Galaxy S26 Ultra and the iPhone Duo.</p><p>Vapor chambers help move heat across the phone, allowing it to dissipate more evenly, and keep key components from overheating. It also helps improve sustained performance, and les the phone work harder for longer. </p><p>Admittedly, the Z Fold 8 does have pretty good sustained performance compared to the S26 Ultra (72.4% versus 53.9%) but it's behind the iPhone 18 Pro Max (79.4%), But can you imagine how much better things could be if there was a vapor chamber to help keep everything cool?</p><h2 id="two-things-iphone-duo-can-keep">Two things iPhone Duo can keep</h2><h3 class="article-body__section" id="section-curved-corners"><span>Curved corners</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:2144px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4oMko37sfDNte8KzjvzD2M" name="Apple iPhone Duo hands on-3" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/4oMko37sfDNte8KzjvzD2M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2144" height="1206" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apple loves curved corners on its phones, a design that has made its way to foldables as well. Samsung may have opted for more curved corners on its non-folding phones, like Galaxy S26, but for the time being foldables have retained the sharper right-angles Samsung was once known for. The Galaxy Z Fold 9 should stay the same way.</p><p>My issue with the iPhone Duo is the lack of symmetry in the design. If you look at it from the cover display, the disparity between the left side and right side is painfully apparent. It looks wrong to have curved corners on one side and rounded edges on the other, even if you don't actually see that when the phone is unfolded.</p><p>The Z Fold 8 and Z Fold 8 Ultra are the total opposite, with a symmetrical design regardless of which screen you're actually looking at — and it makes Galaxy foldables all the better to look at. Plus, you're likely to get a little bit more screen space <a href="https://www.tomsguide.com/phones/samsung-phones/does-the-galaxy-z-fold-8-ultra-make-the-most-use-of-its-screen-space-i-streamed-a-bunch-of-movies-and-tv-shows-to-find-out">if you're using the phone in certain display configurations.</a></p><h3 class="article-body__section" id="section-the-esim-only-design"><span>The eSIM only design</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="Z4xNVatT98sDPTLnax5YtC" name="GettyImages-921346060.jpg" alt="eSIM" src="https://cdn.mos.cms.futurecdn.net/Z4xNVatT98sDPTLnax5YtC-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1687" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AndreyPopov)</span></figcaption></figure><p>Apple has been aggressively pushing eSIMs the past few years, and that's led to a foldable with no support for physical SIM cards — regardless of which part of the world you buy it in. Samsung, on the other hand, has stuck to the physical nano SIM slot on all its flagship phones — and it should continue that trend for Z Fold 9.</p><p>I get the appeal of eSIMs in certain situations, but I also feel as though they come with a key disadvantage compared to physical SIM cards. A physical SIM pops out of your phone and into another device without issue, while eSIMs have to be digitally transferred. The process is not as awkward or laborious as it used to be, but it's still not as convenient.</p><p>If you prefer eSIMs, that's great, more power to you. But it's good to offer users a choice on how they connect to cell networks, rather than deciding for you and giving you no flexibility. Which is a very Apple way of doing things.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-and-iphone-18-pro-your-10-biggest-questions-answered">I've been testing the iPhone 18 Pro Max and iPhone 18 Pro — your 10 biggest questions answered</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-teardown-reveals-the-ins-and-outs-of-the-latest-iphone-models-including-one-annoying-repair-issue">iPhone 18 Pro teardown reveals the ins and outs of the latest iPhone models — including one annoying repair issue</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apples-usd250-million-class-action-settlement-website-is-now-open-heres-how-eligible-iphone-owners-can-file-a-claim-and-how-much-theyll-get">Apple's $250 million class action settlement website is now open — here's how eligible iPhone owners can file a claim and how much they'll get</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/5-things-galaxy-z-fold-9-needs-to-steal-from-iphone-duo-and-2-it-shouldnt</link>
                                                                            <description>
                            <![CDATA[ Samsung Galaxy Z Fold 9 is going to need to copy these iPhone Duo features if it wants to avoid being knocked off the top spot. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">oAEvPxR7JwegDPSQ2aA38b</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 22 Sep 2026 04:30:00 +0000</pubDate>                                                                                                                                <updated>Tue, 22 Sep 2026 08:42:09 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:description>                                                            <media:text><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:text>
                                <media:title type="plain"><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> is ticking all of the right boxes at the moment, wowing just about everyone that's been able to use it ahead of its official release Oct. 23. We still don't know how much of a success the phone will be, especially considering the $2,000 price tag, but you can be sure other phone makers are watching closely — especially Samsung.</p><p>Samsung has been the de-factor king of the foldable phone business for several years. Mainly because, outside of China, the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldables</a> have been limited to Google and Motorola — who haven't exactly put up much of a fight. Apple could finally bring the Galaxy Fold series some serious competition, and if I were Samsung I'd be looking for ways to make my foldables stand out. Even if it means blatantly copying Apple's ideas.</p><p>Here are five things the Galaxy Z Fold 9 should steal from iPhone Duo, and two things it should leave well alone.</p><h2 id="what-z-fold-9-should-steal-from-iphone-duo">What Z Fold 9 should steal from iPhone Duo</h2><h3 class="article-body__section" id="section-under-display-camera"><span>Under display camera</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="Mdj8kozN6J8WNXPhazFQFa" name="iPhone Duo edit 1" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/Mdj8kozN6J8WNXPhazFQFa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Samsung had under-display cameras on the Galaxy Z Fold lineup for four generations, from the <a href="https://www.tomsguide.com/reviews/samsung-galaxy-z-fold-3">Galaxy Z Fold 3</a> to <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-6-review-test-results">Z Fold 6</a>. The quality of those cameras was a little... weak, to say the least, so it's no surprise that Samsung pulled them for the last two generations. But maybe now is the time to bring them back.</p><p>Apple has added an under-display camera to the iPhone Duo's foldable display, though this one isn't designed for selfies. Apple has referred to it as a FaceTime camera, and talked about its use as an aid for video calling. That suggests the quality isn't all that either, but by limiting its use cases (at least in marketing) Apple can avoid the same criticisms as Samsung.</p><p>This means the Z Fold 9 could be the perfect time for Samsung to bring the under-display camera back — and give you more of your screen back. Plus, considering you can already take selfies with the rear cameras and the hole-punch on the cover display, I'd avoid using it as a way to take photos of yourself.</p><h3 class="article-body__section" id="section-s-pen-support"><span>S Pen support</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="JUVSwuTeFABcGUzkRL8WtU" name="Galaxy Z Fold 6 and S Pen.jpg" alt="Samsung Galaxy Z Fold 6 and S Pen" src="https://cdn.mos.cms.futurecdn.net/JUVSwuTeFABcGUzkRL8WtU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The loss of the stylus is one of the things Galaxy foldable fans have been complaining about since the release of <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a>. The stylus requires a special digitizer layer in the display, which was removed in an apparent attempt to reduce thickness. Which isn't a great reason to remove a long-standing feature, especially when it leaves Galaxy foldables feeling a little bit lacking.</p><p>Not only does the<a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it"> iPhone Duo have stylus support, it uses the Apple Pencil USB-C</a> — which is compatible with almost every iPad on sale. There's no special iPhone-exclusive stylus; it's the one a lot of iPad users may already have. The same couldn't be said for past Z Fold models, which needed a special foldable-exclusive stylus designed for the more fragile folding display.</p><p>I felt that the Galaxy Z Fold 8 Ultra was missing out on account of its lost stylus, and the launch of Z Fold 9 would be the perfect opportunity to reintroduce that support. Ideally, it would the form of a stylus that will work across Galaxy devices, including tablets and other phones.</p><h3 class="article-body__section" id="section-ip68-durability"><span>IP68 durability</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="F6qr2SDN3gLqxsmgpqVYsY" name="Fold 8 back 2" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/F6qr2SDN3gLqxsmgpqVYsY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Google was the first foldable phone maker in the U.S. to add IP68 water and dust resistance to foldables with <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Pixel 10 Pro Fold</a>, and Apple has followed its example with iPhone Duo. Galaxy Z Fold 8, on the other hand only has an IP48 rating, which means it's totally exposed to dust — even if it is sealed tight against water.</p><p>Obviously, that's not a good look for Samsung, especially when you consider all the moving parts associated with a foldable hinge. You should be able to take your $1,900 to $2,000 foldable to the beach. So Samsung definitely needs to do better with the Z Fold 9.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><h3 class="article-body__section" id="section-magnetic-wireless-charging-built-in"><span>Magnetic wireless charging built in</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="q4DNX2SeEFU5sCTTt45wEa" name="iphone duo edit 5" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/q4DNX2SeEFU5sCTTt45wEa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One of the things I'll never understand is why Samsung is so <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-may-skip-adding-qi2-to-the-galaxy-s26-ultra-and-i-think-theyve-made-the-right-call">seemingly against adding magnetic wireless charging</a> to its phones — foldables included. The phones support Qi2 wireless charging technology, but they lack the integrated magnets that let chargers and accessories snap into place.</p><p>One reason I was given was that<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-may-skip-adding-qi2-to-the-galaxy-s26-ultra-and-i-think-theyve-made-the-right-call"> the magnets interfered with the S Pen</a>, and Samsung couldn't offer both. But considering the iPhone Duo has Apple Pencil support and MagSafe, it's clear that there is a way to offer both features without asking users to compromise. Because a magnetic case system is just a poor show for a phone company that sells devices for close to two thousand dollars.</p><h3 class="article-body__section" id="section-an-actual-vapor-chamber"><span>An actual Vapor Chamber</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:3330px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tgL6AweqbNKzVVmQctz95Z" name="Galaxy Z Fold 8 review-22" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/tgL6AweqbNKzVVmQctz95Z-1920-80.jpg" mos="" align="middle" fullscreen="" width="3330" height="1873" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Snapdragon 8 Elite Gen 5 for Galaxy chipset is powerful. But the phones that use it can get quite hot, and a lack of cooling can lead to worse sustained performance.That's why Samsung needs to add a vapor chamber, much like the Galaxy S26 Ultra and the iPhone Duo.</p><p>Vapor chambers help move heat across the phone, allowing it to dissipate more evenly, and keep key components from overheating. It also helps improve sustained performance, and les the phone work harder for longer. </p><p>Admittedly, the Z Fold 8 does have pretty good sustained performance compared to the S26 Ultra (72.4% versus 53.9%) but it's behind the iPhone 18 Pro Max (79.4%), But can you imagine how much better things could be if there was a vapor chamber to help keep everything cool?</p><h2 id="two-things-iphone-duo-can-keep">Two things iPhone Duo can keep</h2><h3 class="article-body__section" id="section-curved-corners"><span>Curved corners</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:2144px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4oMko37sfDNte8KzjvzD2M" name="Apple iPhone Duo hands on-3" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/4oMko37sfDNte8KzjvzD2M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2144" height="1206" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apple loves curved corners on its phones, a design that has made its way to foldables as well. Samsung may have opted for more curved corners on its non-folding phones, like Galaxy S26, but for the time being foldables have retained the sharper right-angles Samsung was once known for. The Galaxy Z Fold 9 should stay the same way.</p><p>My issue with the iPhone Duo is the lack of symmetry in the design. If you look at it from the cover display, the disparity between the left side and right side is painfully apparent. It looks wrong to have curved corners on one side and rounded edges on the other, even if you don't actually see that when the phone is unfolded.</p><p>The Z Fold 8 and Z Fold 8 Ultra are the total opposite, with a symmetrical design regardless of which screen you're actually looking at — and it makes Galaxy foldables all the better to look at. Plus, you're likely to get a little bit more screen space <a href="https://www.tomsguide.com/phones/samsung-phones/does-the-galaxy-z-fold-8-ultra-make-the-most-use-of-its-screen-space-i-streamed-a-bunch-of-movies-and-tv-shows-to-find-out">if you're using the phone in certain display configurations.</a></p><h3 class="article-body__section" id="section-the-esim-only-design"><span>The eSIM only design</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="Z4xNVatT98sDPTLnax5YtC" name="GettyImages-921346060.jpg" alt="eSIM" src="https://cdn.mos.cms.futurecdn.net/Z4xNVatT98sDPTLnax5YtC-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1687" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AndreyPopov)</span></figcaption></figure><p>Apple has been aggressively pushing eSIMs the past few years, and that's led to a foldable with no support for physical SIM cards — regardless of which part of the world you buy it in. Samsung, on the other hand, has stuck to the physical nano SIM slot on all its flagship phones — and it should continue that trend for Z Fold 9.</p><p>I get the appeal of eSIMs in certain situations, but I also feel as though they come with a key disadvantage compared to physical SIM cards. A physical SIM pops out of your phone and into another device without issue, while eSIMs have to be digitally transferred. The process is not as awkward or laborious as it used to be, but it's still not as convenient.</p><p>If you prefer eSIMs, that's great, more power to you. But it's good to offer users a choice on how they connect to cell networks, rather than deciding for you and giving you no flexibility. Which is a very Apple way of doing things.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-and-iphone-18-pro-your-10-biggest-questions-answered">I've been testing the iPhone 18 Pro Max and iPhone 18 Pro — your 10 biggest questions answered</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-teardown-reveals-the-ins-and-outs-of-the-latest-iphone-models-including-one-annoying-repair-issue">iPhone 18 Pro teardown reveals the ins and outs of the latest iPhone models — including one annoying repair issue</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apples-usd250-million-class-action-settlement-website-is-now-open-heres-how-eligible-iphone-owners-can-file-a-claim-and-how-much-theyll-get">Apple's $250 million class action settlement website is now open — here's how eligible iPhone owners can file a claim and how much they'll get</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The iPhone Duo has a lot of hype, but this poll has a surprising reveal for Samsung's foldable ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We asked Tom's Guide readers if they would rather pick up Apple's new <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> or the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8</a>, and the winner was quite surprising. </p><p>With 2,761 votes, one device proved far more popular than the other by more than double the votes, but was it the Apple iPhone Duo or Samsung Galaxy Z Fold 8? Check out the results below.</p><h2 id="which-flagship-foldable-would-you-rather-purchase">Which flagship foldable would you rather purchase?</h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><ul><li><strong>1st place: </strong>62%, Samsung Galaxy Z Fold 8</li><li><strong>2nd place: </strong>23%, iPhone Duo</li><li><strong>3rd place: </strong>15%, Neither</li></ul><p>With a total of 1,705 votes, 62% of respondents said the Samsung foldable is their preferred foldable phone. Apple's Duo came in a distant second with 632 votes, or 23%. </p><p>Meanwhile, 424 people said they weren't interested in either phone. If you find yourself in that camp, what would you buy instead? Or is this category too pricey for you?</p><h2 id="the-galaxy-z-fold-8-is-the-winner-but-why">The Galaxy Z Fold 8 is the winner, but why?</h2><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="8SvD4aoQkrBzEjS7QrbW5S" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/8SvD4aoQkrBzEjS7QrbW5S-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So why did the Galaxy Z Fold 8 dominate our poll over the iPhone Duo. </p><p>I think it comes down to a few of factors in the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-which-foldable-is-best-for-you#section-iphone-duo-vs-samsung-galaxy-z-fold-8-price-availability">battle between the Z Fold 8 and iPhone Duo</a>: design, price and expertise.</p><p>The Duo starts at $1,999 for the 256GB version and goes up to over $3k for the 2TB option. Samsung's foldable starts at $1,899, not a big difference but with how expensive the world has gotten in the last two years every dollar matters. No, Samsung doesn't offer a 2TB variant but the top-end 1TB model will cost you $2,499, again $100 than the equivalent Duo version.</p><p>Additionally, the Z Fold 8 offers a thinner and lighter design than the iPhone Duo. And Samsung lets you run more than two apps at once, which is better for multitasking. Plus, Samsung has been iterating foldables for eight generations, while this is Apple's first attempt.</p><p>There is concern over visibility and brightness with the matte finish on the Duo display, which is meant to hide the crease. Pictures of CEO John Ternus at the Emmys recently <a href="https://www.reddit.com/r/iPhoneFold/comments/1whl32i/john_ternus_shows_iphone_duo_at_the_emmys/" target="_blank">stirred up controversy online</a>, but we thought it was plenty bright in our hands-on time.</p><p>As we've found, though, the iPhone Duo <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-7-ways-apples-foldable-beats-its-rival-from-ip68-to-faster-charging-and-more">has multiple features</a> that the Z Fold 8 doesn't, including iP68 durability, stylus support, faster charging, and a vapor chamber for better cooling.</p><h2 id="what-you-have-said">What you have said</h2><p>One reader said <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-7-ways-apples-foldable-beats-its-rival-from-ip68-to-faster-charging-and-more#viafoura-comments">in a comment </a>that they were staying away from all things Apple as they didn't want to get sucked into another ecosystem. "I have Samsungs 8 ultra, and I am impressed with it," they said.</p><p>As a counterpoint, <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-which-foldable-is-best-for-you#viafoura-comments">another reader wrote</a> that the "crucial factor" when comparing Samsung and Apple is Apple's "after-purchase service experience." </p><p>"Functionally, I have liked both platforms, but there is a fundamental difference in corporate philosophy. Apple actively invests in both technology and the customer service infrastructure required to support it. Samsung, on the other hand, focuses almost entirely on tech specs while leaving its customer support framework completely neglected," they said.</p><h2 id="bottom-line">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NE3m4C3QUpw7U8uQfUAmea" name="iPhone-Duo-vs-Galaxy-Z-Fold-8-LEDE3" alt="IPhone duo vs galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The iPhone Duo may be the belle of the ball after its recent announcement, but you won't be able to actually <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-is-official-price-release-date-specs-and-everything-you-need-to-know">hold it in your hands </a>until October 23. </p><p>Meanwhile, the Z Fold 8 is available right now and is a pretty impressive foldable, even if Apple's device beats it in some areas.</p><p>Let us know: why would you pick the Duo or the Z Fold 8? Don't like either? What's your replacement?</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-review"><strong>Apple Watch Ultra 4 review: I ran 22 miles to test Apple’s ultimate adventure watch</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/11-best-ios-27-hidden-features-you-cant-afford-to-miss"><strong>11 best iOS 27 hidden features you can't afford to miss</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-benchmarks-apple-just-built-the-most-powerful-phones-weve-ever-seen"><strong>iPhone 18 Pro and Pro Max benchmarks: These are the fastest phones we've ever tested</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/the-iphone-duo-has-a-lot-of-hype-but-this-poll-has-a-surprising-reveal-for-samsungs-foldable</link>
                                                                            <description>
                            <![CDATA[ Tom's Guide readers let us know which foldable they're more interested in: the iPhone Duo or Galaxy Z Fold 8. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">e3iVtPLZ23jEbY9wPGgcUn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ENFN2u4hpSYiQYfbA6WbcL-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 17 Sep 2026 21:09:50 +0000</pubDate>                                                                                                                                <updated>Mon, 21 Sep 2026 09:51:53 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ENFN2u4hpSYiQYfbA6WbcL-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Apple iPhone Duo shown in hand]]></media:description>                                                            <media:text><![CDATA[Apple iPhone Duo shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Apple iPhone Duo shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ENFN2u4hpSYiQYfbA6WbcL-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We asked Tom's Guide readers if they would rather pick up Apple's new <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> or the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8</a>, and the winner was quite surprising. </p><p>With 2,761 votes, one device proved far more popular than the other by more than double the votes, but was it the Apple iPhone Duo or Samsung Galaxy Z Fold 8? Check out the results below.</p><h2 id="which-flagship-foldable-would-you-rather-purchase">Which flagship foldable would you rather purchase?</h2><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><ul><li><strong>1st place: </strong>62%, Samsung Galaxy Z Fold 8</li><li><strong>2nd place: </strong>23%, iPhone Duo</li><li><strong>3rd place: </strong>15%, Neither</li></ul><p>With a total of 1,705 votes, 62% of respondents said the Samsung foldable is their preferred foldable phone. Apple's Duo came in a distant second with 632 votes, or 23%. </p><p>Meanwhile, 424 people said they weren't interested in either phone. If you find yourself in that camp, what would you buy instead? Or is this category too pricey for you?</p><h2 id="the-galaxy-z-fold-8-is-the-winner-but-why">The Galaxy Z Fold 8 is the winner, but why?</h2><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="8SvD4aoQkrBzEjS7QrbW5S" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/8SvD4aoQkrBzEjS7QrbW5S-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So why did the Galaxy Z Fold 8 dominate our poll over the iPhone Duo. </p><p>I think it comes down to a few of factors in the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-which-foldable-is-best-for-you#section-iphone-duo-vs-samsung-galaxy-z-fold-8-price-availability">battle between the Z Fold 8 and iPhone Duo</a>: design, price and expertise.</p><p>The Duo starts at $1,999 for the 256GB version and goes up to over $3k for the 2TB option. Samsung's foldable starts at $1,899, not a big difference but with how expensive the world has gotten in the last two years every dollar matters. No, Samsung doesn't offer a 2TB variant but the top-end 1TB model will cost you $2,499, again $100 than the equivalent Duo version.</p><p>Additionally, the Z Fold 8 offers a thinner and lighter design than the iPhone Duo. And Samsung lets you run more than two apps at once, which is better for multitasking. Plus, Samsung has been iterating foldables for eight generations, while this is Apple's first attempt.</p><p>There is concern over visibility and brightness with the matte finish on the Duo display, which is meant to hide the crease. Pictures of CEO John Ternus at the Emmys recently <a href="https://www.reddit.com/r/iPhoneFold/comments/1whl32i/john_ternus_shows_iphone_duo_at_the_emmys/" target="_blank">stirred up controversy online</a>, but we thought it was plenty bright in our hands-on time.</p><p>As we've found, though, the iPhone Duo <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-7-ways-apples-foldable-beats-its-rival-from-ip68-to-faster-charging-and-more">has multiple features</a> that the Z Fold 8 doesn't, including iP68 durability, stylus support, faster charging, and a vapor chamber for better cooling.</p><h2 id="what-you-have-said">What you have said</h2><p>One reader said <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-7-ways-apples-foldable-beats-its-rival-from-ip68-to-faster-charging-and-more#viafoura-comments">in a comment </a>that they were staying away from all things Apple as they didn't want to get sucked into another ecosystem. "I have Samsungs 8 ultra, and I am impressed with it," they said.</p><p>As a counterpoint, <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-which-foldable-is-best-for-you#viafoura-comments">another reader wrote</a> that the "crucial factor" when comparing Samsung and Apple is Apple's "after-purchase service experience." </p><p>"Functionally, I have liked both platforms, but there is a fundamental difference in corporate philosophy. Apple actively invests in both technology and the customer service infrastructure required to support it. Samsung, on the other hand, focuses almost entirely on tech specs while leaving its customer support framework completely neglected," they said.</p><h2 id="bottom-line">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="NE3m4C3QUpw7U8uQfUAmea" name="iPhone-Duo-vs-Galaxy-Z-Fold-8-LEDE3" alt="IPhone duo vs galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The iPhone Duo may be the belle of the ball after its recent announcement, but you won't be able to actually <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-is-official-price-release-date-specs-and-everything-you-need-to-know">hold it in your hands </a>until October 23. </p><p>Meanwhile, the Z Fold 8 is available right now and is a pretty impressive foldable, even if Apple's device beats it in some areas.</p><p>Let us know: why would you pick the Duo or the Z Fold 8? Don't like either? What's your replacement?</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/wellness/smartwatches/apple-watch-ultra-4-review"><strong>Apple Watch Ultra 4 review: I ran 22 miles to test Apple’s ultimate adventure watch</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/11-best-ios-27-hidden-features-you-cant-afford-to-miss"><strong>11 best iOS 27 hidden features you can't afford to miss</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-benchmarks-apple-just-built-the-most-powerful-phones-weve-ever-seen"><strong>iPhone 18 Pro and Pro Max benchmarks: These are the fastest phones we've ever tested</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Duo vs Samsung Galaxy Z Fold 8: Which foldable phone will win? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The world of foldable phones is about to change in a big way, and it's all thanks to the release of the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a>. Apple's first foldable phone has generated a lot of buzz, and it certainly has the brand recognition going for it, but does it have what it takes to take the crown from Samsung's Galaxy Z Fold 8?</p><p>Samsung has almost a decade of experience making the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldables</a>, and the newly-released <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> is easily one of its best yet. It may lack some of the features of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>, but it makes up for it with a wider, passport-shaped design that is much more comfortable to hold and use — especially for streaming movies and TV shows.</p><p>The question is, which of these wide foldables is the right one for you? We compare the iPhone Duo vs Samsung Galaxy Z Fold 8 to help you decide.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-specs"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>iPhone Duo</strong></p></td><td  ><p><strong>Samsung Galaxy Z Fold 8</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,999 / £1,999 AU$3,499</p></td><td  ><p>From $1,899 / £1,699 / AU$2,699</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong></p></td><td  ><p>5.4 inches (1398 x 2034)</p></td><td  ><p>5.5 inches (1248 x 1972)</p></td></tr><tr><td class="firstcol " ><p><strong>Foldable Display</strong></p></td><td  ><p>7.6 inches (1878 x 2670)</p></td><td  ><p>7.6 inches (2448 x 1848)</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh Rate</strong></p></td><td  ><p>1-120Hz</p></td><td  ><p>1-120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td><td  ><p>12-16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB / 512GB / 1TB / 2TB</p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>48MP (main), 48MP (ultrawide)</p></td><td  ><p>50MP main, 50MP (ultrawide)</p></td></tr><tr><td class="firstcol " ><p><strong>Front cameras</strong></p></td><td  ><p>12MP selfie, Under display camera</p></td><td  ><p>2 x 10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,883 mAh </p></td><td  ><p>4,800 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging speed</strong></p></td><td  ><p>60W (wired), 25W (wireless)</p></td><td  ><p>45W (wired), 20W (wireless)</p></td></tr><tr><td class="firstcol " ><p><strong>IP rating</strong></p></td><td  ><p>IP68</p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Size (Closed)</strong></p></td><td  ><p>117.8 x 84.1 x 11.3mm ( 3.31 x 4.64 x 0.44 inches)</p></td><td  ><p>123.9 x 81.9 x 9.7 mm (4.88 × 3.22 × 0.38 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Size (Open)</strong></p></td><td  ><p>117.8 x 164.6 x 5.2mm (6.48 x 4.64 x 0.21 inches)</p></td><td  ><p>123.9 x 161.4 x 4.5 mm (4.87 x 6.35 x 0.17 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>254 g (8.96 oz)</p></td><td  ><p>201 g (7.09 oz)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Night Sky, Star White</p></td><td  ><p>Graphite, Cream, Lavender, Pistachio</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-price-availability"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Price & availability</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2297px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g8hRHytY7NFuF8mBGUagyL" name="Apple iPhone Duo hands on" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/g8hRHytY7NFuF8mBGUagyL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2297" height="1292" attribution="" endorsement="" class="inline"></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 iPhone Duo pre-orders open on October 16, with a release date scheduled for October 23. Prices start at $1,999 / £1,999 / AU$3,499 for a model with 256GB of storage. Higher storage options are available including 512GB ($2,199 / £2,199 / AU$3,899), 1TB ($2,599 / £2,599 / AU$4,699) and 2TB ($3,199 / £3,199 / AU$5,899).</p><p>The Samsung Galaxy Z Fold 8 is on sale now from all major retailers and carriers. Prices start at $1,899/£1,699/AU$2,699 for a model with 256GB of Storage and 12GB RAM. The 512GB model is $2,099 / £1,869 / AU$2,999, and a 1TB model with 16GB of RAM will cost you $2,499 / £2,209 / AU$3,599.</p><p>While Samsung doesn't offer a 2TB option, it does have the price advantage, with comparable storage costing $100 less in the U.S., with significantly higher gaps in the U.K. and Australia.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-design-display"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Design & Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3474px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mj4pJujYsro9afSyvR3ffZ" name="Galaxy Z Fold 8 review-18" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/mj4pJujYsro9afSyvR3ffZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3474" height="1954" attribution="" endorsement="" class="inline"></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 phones have the wider passport-shaped design that's currently in fashion in the foldable phone market. Both unfold to produce a larger 7.6-inch display, and have an aspect ratio close to 4:3 — which is the same as a lot of popular tablets. However, the Galaxy Z Fold 8 has the slightly larger cover display, measuring 5.5-inches to Apple's 5.4-inches.</p><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing">Z Fold 8's screen offers an anti-glare coating</a> to improve visibility in bright conditions. The iPhone Duo answers with a nano-texture matte display. Both phones do a good job of minimizing the the crease, though additional time with the Z Fold 8 has proven that the creasing does get more prominent — regardless of how uniform the display is out of the box. However, we will see how the iPhone Duo's screen performs when it is released.</p><p>The most notable design differences come with size and weight. While the iPhone Duo is thinner than the likes of the iPhone Air, it's not quite as slim as the Z Fold 8, which sits at 4.5mm to the Duo's 5.2 mm when both phones are unfolded.</p><p>The Z Fold 8 is also noticeably lighter, with a weight of 7.09 ounces, versus the iPhone Duo's 8.96 ounces. That mass actually makes the Duo the heaviest iPhone Apple has released, likely on account of it being a double-sided phone.</p><p>The iPhone Duo has a major durability advantage, though. Only it offers IP68 durability for water and dust resistance. Samsung's foldable only has water resistance.</p><p>Both phones feature fingerprint scanners in the power buttons, and hole-punch cameras in the cover display. However, the Z Fold 8 also has a second hole-punch camera in the foldable screen, while Apple has opted for an under-display lens.</p><p>The Z Fold 8 is available to buy in Graphite, Cream, Lavender and Pistachio coloring, while iPhone Duo is only available in Night Sky (Blue) and Star White.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-cameras"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SoAi2j7o9Dqs6v288A4cEa" name="iPhone Duo edit 3" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/SoAi2j7o9Dqs6v288A4cEa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Both foldable phones come with a dual rear camera setup, consisting of main and ultrawide angle lenses. Sadly, unlike their non-folding counterparts, there is no telephoto lens here. That means all zooming capabilities are done digitally.</p><p>The iPhone Duo offers a pair of 48MP cameras, while the Z Fold 8 has 50MP. This seemingly gives the Z Fold 8 an advantage, but we won't know how these two cameras compare until we get an iPhone Duo for testing.</p><p>The Z Fold 8 managed to produce excellent photos in our testing other than its 10x digital zoom shots. We expect that the iPhone Duo will offer similar quality snaps, though Apple's computational photography could push things a little further.</p><p>The front cameras are a little different, since Apple hasn't just added identical lenses on both screens like Samsung did. The Galaxy Z Fold 8 features two 10MP hole-punch cameras, one in each of its screens. The iPhone Duo has a 12MP hole punch camera on the cover display and an unnamed "FaceTime Camera" that sits under the display.</p><p>This camera appears when in use, and has been advertised as useful for FaceTime and other video calls — rather than selfies and photography. That suggests that the quality isn't fantastic, but we will evaluate that in our iPhone Duo review.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-performance"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3330px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tgL6AweqbNKzVVmQctz95Z" name="Galaxy Z Fold 8 review-22" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/tgL6AweqbNKzVVmQctz95Z-1920-80.jpg" mos="" align="middle" fullscreen="" width="3330" height="1873" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apple used to dominate at performance, but in recent years Qualcomm's Snapdragon chips have caught up pretty fast — particularly thanks to Samsung's custom "for Galaxy" chipsets. The Z Fold 8 has one of those chips, the Snapdragon 8 Elite Gen 5 for Galaxy, which offers better performance than you'd find on the standard Gen 5 chip. </p><p>The iPhone Duo is set to come with the A20 Pro chipset, Apple's latest and best SoC that promises to be 20% faster than the A19 Pro, with a 40% improvement to graphics performance — which is something Apple chips have often struggled with. The chip also contains a second neural engine, which is said to double the AI processing power.</p><p>We haven't benchmarked the iPhone Duo yet, but we anticipate that the A20 Pro will outperform Samsung's foldable in terms of sheer speed but also sustained performance. That's because only the Duo has a vapor chamber for cooling.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-software-ai"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Software & AI</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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple has been far behind in the AI arms race, but the new Siri AI that comes with the <a href="https://www.tomsguide.com/phones/iphones/ios-27-7-features-you-need-to-try-first-after-updating">iOS 27</a> update is a lot more capable than before. Siri can perform multiple tasks with a single voice prompt; it offers smarter personal context; and you get more expressive voice options. There's also new AI-powered photo editing features like Reframe and Clean up. </p><p>The iPhone Duo also comes with a new Smart Tracking camera feature, similar to the <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-using-the-galaxy-z-fold-8s-myfancam-on-my-dogs-but-i-hit-a-major-wall">Z Fold 8's MyFanCam</a>, which tracks users in frame when recording video. </p><p>The Z Fold 8 comes with all the best Galaxy AI features, including Now Nudge's contextual resurfacing tool, Now Brief to prepare you for different parts of the day, and the advanced version of Circle to Search that can identify multiple things at once.</p><p>Multitasking might be the clincher between these two devices, though. The Z Fold 8 supports up to four windows at once, as well as floating app windows that can sit wherever you like on screen. However, the iPhone Duo only supports two Split View windows at a time.. Sadly, the iPhone Duo only supports two Split View apps at a time, which puts it at a productivity disadvantage. </p><p>Then again, the iPhone Duo <a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it">also supports the Apple Pencil (USB-C) stylus</a>, which is something the Z Fold 8 can not do. Apple's foldable has a feature that detects the angle of the screen, similar to the Galaxy Z Fold 8 Ultra's Flex View mode. This alters the interface of the app in question to account for the angle of your screen. Sadly, while the Ultra model offers this feature, the regular Z Fold 8 itself misses out.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-battery"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Battery</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2332px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="SzqLLphnRAA8Pka8QDDMCZ" name="Galaxy Z Fold 8 review-11" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/SzqLLphnRAA8Pka8QDDMCZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2332" height="1312" attribution="" endorsement="" class="inline"></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 iPhone Duo is expected to come with a 4,883 mAh battery pack, which is incrementally larger than the Z Fold 8's 4,800 mAh battery. But that doesn't necessarily mean it will last longer based on capacity alone.</p><p>Apple has worked hard to improve energy efficiency over the years, and that hasn't changed. The A20 Pro reportedly offers a 30% improvement in energy efficiency, while the Apple C2 modem is reportedly 15% more efficient than the older C1X. </p><p>Combined with the battery, we could see the iPhone Duo jump ahead from the Z Fold 8's 12 hours and 19 minute battery life based on that optimization alone. Though we'll obviously need to do some in-depth battery life testing before we can say for sure.</p><p>As for charging, expect the iPhone Duo to recharge faster. The 60W wired charging restores 50% charge in just 15 minutes and you get 25W wireless charging. The Z Fold 8 only has 45W wired charging and 20W wireless charging, which allows it to regain 43% in 15 minutes.</p><p>That's not a huge difference, but Apple has the edge. Plus, only the iiPhone Duo offers MagSafe charging.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-outlook"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Outlook</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AnoVUix3XWR3icSBBfRFFg" name="Z Fold 8 vs iPhone Duo" alt="Galaxy Z Fold 8 vs iPhone duo" src="https://cdn.mos.cms.futurecdn.net/AnoVUix3XWR3icSBBfRFFg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We sill need to test the iPhone Duo to see how well the software works and how long the battery life is . But based on our hands-on impressions and everything we know so far, Apple should give Samsung some real competition. </p><p>The iPhone Duo has some notable advantages, including its IP68 durability, powerful A20 chip and, an even less visible crease, MagSafe and Apple Pencil support and faster charging.</p><p>The Galaxy Z Fold 8 is $100 less than the iPhone Duo; it comes in a thinner and lighter design, and it has better for multitasking. We also can't ignore the fact that this is Apple's first attempt at a foldable phone, while Samsung is currently on its eighth generation. </p><p>Stay tuned for our in-depth face-of to declare a winner.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-exclusive-apple-ceo-john-ternus-variable-aperture-camera">iPhone 18 Pro Exclusive: Apple CEO John Ternus on why the new variable aperture camera is the ‘best of both worlds’</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-7-features-you-need-to-try-first-after-updating">iOS 27: 7 features you need to try first after updating</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-vs-iphone-14-pro-max-all-the-differences-and-should-you-upgrade">iPhone 18 Pro Max vs iPhone 14 Pro Max: All the differences and should you upgrade?</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-which-foldable-is-best-for-you</link>
                                                                            <description>
                            <![CDATA[ iPhone Duo is coming to try and claim Galaxy Z fold 8's crown, but can it suceed? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LpwvKcoYHeFHZgdeWTVZk3</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 16 Sep 2026 04:30:00 +0000</pubDate>                                                                                                                                <updated>Wed, 16 Sep 2026 11:30:31 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:description>                                                            <media:text><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:text>
                                <media:title type="plain"><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The world of foldable phones is about to change in a big way, and it's all thanks to the release of the <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a>. Apple's first foldable phone has generated a lot of buzz, and it certainly has the brand recognition going for it, but does it have what it takes to take the crown from Samsung's Galaxy Z Fold 8?</p><p>Samsung has almost a decade of experience making the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldables</a>, and the newly-released <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> is easily one of its best yet. It may lack some of the features of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>, but it makes up for it with a wider, passport-shaped design that is much more comfortable to hold and use — especially for streaming movies and TV shows.</p><p>The question is, which of these wide foldables is the right one for you? We compare the iPhone Duo vs Samsung Galaxy Z Fold 8 to help you decide.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-specs"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>iPhone Duo</strong></p></td><td  ><p><strong>Samsung Galaxy Z Fold 8</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$1,999 / £1,999 AU$3,499</p></td><td  ><p>From $1,899 / £1,699 / AU$2,699</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong></p></td><td  ><p>5.4 inches (1398 x 2034)</p></td><td  ><p>5.5 inches (1248 x 1972)</p></td></tr><tr><td class="firstcol " ><p><strong>Foldable Display</strong></p></td><td  ><p>7.6 inches (1878 x 2670)</p></td><td  ><p>7.6 inches (2448 x 1848)</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh Rate</strong></p></td><td  ><p>1-120Hz</p></td><td  ><p>1-120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>A20 Pro</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB</p></td><td  ><p>12-16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB / 512GB / 1TB / 2TB</p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>48MP (main), 48MP (ultrawide)</p></td><td  ><p>50MP main, 50MP (ultrawide)</p></td></tr><tr><td class="firstcol " ><p><strong>Front cameras</strong></p></td><td  ><p>12MP selfie, Under display camera</p></td><td  ><p>2 x 10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,883 mAh </p></td><td  ><p>4,800 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging speed</strong></p></td><td  ><p>60W (wired), 25W (wireless)</p></td><td  ><p>45W (wired), 20W (wireless)</p></td></tr><tr><td class="firstcol " ><p><strong>IP rating</strong></p></td><td  ><p>IP68</p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Size (Closed)</strong></p></td><td  ><p>117.8 x 84.1 x 11.3mm ( 3.31 x 4.64 x 0.44 inches)</p></td><td  ><p>123.9 x 81.9 x 9.7 mm (4.88 × 3.22 × 0.38 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Size (Open)</strong></p></td><td  ><p>117.8 x 164.6 x 5.2mm (6.48 x 4.64 x 0.21 inches)</p></td><td  ><p>123.9 x 161.4 x 4.5 mm (4.87 x 6.35 x 0.17 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>254 g (8.96 oz)</p></td><td  ><p>201 g (7.09 oz)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Night Sky, Star White</p></td><td  ><p>Graphite, Cream, Lavender, Pistachio</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-price-availability"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Price & availability</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2297px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="g8hRHytY7NFuF8mBGUagyL" name="Apple iPhone Duo hands on" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/g8hRHytY7NFuF8mBGUagyL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2297" height="1292" attribution="" endorsement="" class="inline"></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 iPhone Duo pre-orders open on October 16, with a release date scheduled for October 23. Prices start at $1,999 / £1,999 / AU$3,499 for a model with 256GB of storage. Higher storage options are available including 512GB ($2,199 / £2,199 / AU$3,899), 1TB ($2,599 / £2,599 / AU$4,699) and 2TB ($3,199 / £3,199 / AU$5,899).</p><p>The Samsung Galaxy Z Fold 8 is on sale now from all major retailers and carriers. Prices start at $1,899/£1,699/AU$2,699 for a model with 256GB of Storage and 12GB RAM. The 512GB model is $2,099 / £1,869 / AU$2,999, and a 1TB model with 16GB of RAM will cost you $2,499 / £2,209 / AU$3,599.</p><p>While Samsung doesn't offer a 2TB option, it does have the price advantage, with comparable storage costing $100 less in the U.S., with significantly higher gaps in the U.K. and Australia.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-design-display"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Design & Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3474px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="mj4pJujYsro9afSyvR3ffZ" name="Galaxy Z Fold 8 review-18" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/mj4pJujYsro9afSyvR3ffZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3474" height="1954" attribution="" endorsement="" class="inline"></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 phones have the wider passport-shaped design that's currently in fashion in the foldable phone market. Both unfold to produce a larger 7.6-inch display, and have an aspect ratio close to 4:3 — which is the same as a lot of popular tablets. However, the Galaxy Z Fold 8 has the slightly larger cover display, measuring 5.5-inches to Apple's 5.4-inches.</p><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing">Z Fold 8's screen offers an anti-glare coating</a> to improve visibility in bright conditions. The iPhone Duo answers with a nano-texture matte display. Both phones do a good job of minimizing the the crease, though additional time with the Z Fold 8 has proven that the creasing does get more prominent — regardless of how uniform the display is out of the box. However, we will see how the iPhone Duo's screen performs when it is released.</p><p>The most notable design differences come with size and weight. While the iPhone Duo is thinner than the likes of the iPhone Air, it's not quite as slim as the Z Fold 8, which sits at 4.5mm to the Duo's 5.2 mm when both phones are unfolded.</p><p>The Z Fold 8 is also noticeably lighter, with a weight of 7.09 ounces, versus the iPhone Duo's 8.96 ounces. That mass actually makes the Duo the heaviest iPhone Apple has released, likely on account of it being a double-sided phone.</p><p>The iPhone Duo has a major durability advantage, though. Only it offers IP68 durability for water and dust resistance. Samsung's foldable only has water resistance.</p><p>Both phones feature fingerprint scanners in the power buttons, and hole-punch cameras in the cover display. However, the Z Fold 8 also has a second hole-punch camera in the foldable screen, while Apple has opted for an under-display lens.</p><p>The Z Fold 8 is available to buy in Graphite, Cream, Lavender and Pistachio coloring, while iPhone Duo is only available in Night Sky (Blue) and Star White.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-cameras"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SoAi2j7o9Dqs6v288A4cEa" name="iPhone Duo edit 3" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/SoAi2j7o9Dqs6v288A4cEa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Both foldable phones come with a dual rear camera setup, consisting of main and ultrawide angle lenses. Sadly, unlike their non-folding counterparts, there is no telephoto lens here. That means all zooming capabilities are done digitally.</p><p>The iPhone Duo offers a pair of 48MP cameras, while the Z Fold 8 has 50MP. This seemingly gives the Z Fold 8 an advantage, but we won't know how these two cameras compare until we get an iPhone Duo for testing.</p><p>The Z Fold 8 managed to produce excellent photos in our testing other than its 10x digital zoom shots. We expect that the iPhone Duo will offer similar quality snaps, though Apple's computational photography could push things a little further.</p><p>The front cameras are a little different, since Apple hasn't just added identical lenses on both screens like Samsung did. The Galaxy Z Fold 8 features two 10MP hole-punch cameras, one in each of its screens. The iPhone Duo has a 12MP hole punch camera on the cover display and an unnamed "FaceTime Camera" that sits under the display.</p><p>This camera appears when in use, and has been advertised as useful for FaceTime and other video calls — rather than selfies and photography. That suggests that the quality isn't fantastic, but we will evaluate that in our iPhone Duo review.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-performance"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3330px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tgL6AweqbNKzVVmQctz95Z" name="Galaxy Z Fold 8 review-22" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/tgL6AweqbNKzVVmQctz95Z-1920-80.jpg" mos="" align="middle" fullscreen="" width="3330" height="1873" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Apple used to dominate at performance, but in recent years Qualcomm's Snapdragon chips have caught up pretty fast — particularly thanks to Samsung's custom "for Galaxy" chipsets. The Z Fold 8 has one of those chips, the Snapdragon 8 Elite Gen 5 for Galaxy, which offers better performance than you'd find on the standard Gen 5 chip. </p><p>The iPhone Duo is set to come with the A20 Pro chipset, Apple's latest and best SoC that promises to be 20% faster than the A19 Pro, with a 40% improvement to graphics performance — which is something Apple chips have often struggled with. The chip also contains a second neural engine, which is said to double the AI processing power.</p><p>We haven't benchmarked the iPhone Duo yet, but we anticipate that the A20 Pro will outperform Samsung's foldable in terms of sheer speed but also sustained performance. That's because only the Duo has a vapor chamber for cooling.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-software-ai"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Software & AI</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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple has been far behind in the AI arms race, but the new Siri AI that comes with the <a href="https://www.tomsguide.com/phones/iphones/ios-27-7-features-you-need-to-try-first-after-updating">iOS 27</a> update is a lot more capable than before. Siri can perform multiple tasks with a single voice prompt; it offers smarter personal context; and you get more expressive voice options. There's also new AI-powered photo editing features like Reframe and Clean up. </p><p>The iPhone Duo also comes with a new Smart Tracking camera feature, similar to the <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-using-the-galaxy-z-fold-8s-myfancam-on-my-dogs-but-i-hit-a-major-wall">Z Fold 8's MyFanCam</a>, which tracks users in frame when recording video. </p><p>The Z Fold 8 comes with all the best Galaxy AI features, including Now Nudge's contextual resurfacing tool, Now Brief to prepare you for different parts of the day, and the advanced version of Circle to Search that can identify multiple things at once.</p><p>Multitasking might be the clincher between these two devices, though. The Z Fold 8 supports up to four windows at once, as well as floating app windows that can sit wherever you like on screen. However, the iPhone Duo only supports two Split View windows at a time.. Sadly, the iPhone Duo only supports two Split View apps at a time, which puts it at a productivity disadvantage. </p><p>Then again, the iPhone Duo <a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it">also supports the Apple Pencil (USB-C) stylus</a>, which is something the Z Fold 8 can not do. Apple's foldable has a feature that detects the angle of the screen, similar to the Galaxy Z Fold 8 Ultra's Flex View mode. This alters the interface of the app in question to account for the angle of your screen. Sadly, while the Ultra model offers this feature, the regular Z Fold 8 itself misses out.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-battery"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Battery</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2332px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="SzqLLphnRAA8Pka8QDDMCZ" name="Galaxy Z Fold 8 review-11" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/SzqLLphnRAA8Pka8QDDMCZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2332" height="1312" attribution="" endorsement="" class="inline"></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 iPhone Duo is expected to come with a 4,883 mAh battery pack, which is incrementally larger than the Z Fold 8's 4,800 mAh battery. But that doesn't necessarily mean it will last longer based on capacity alone.</p><p>Apple has worked hard to improve energy efficiency over the years, and that hasn't changed. The A20 Pro reportedly offers a 30% improvement in energy efficiency, while the Apple C2 modem is reportedly 15% more efficient than the older C1X. </p><p>Combined with the battery, we could see the iPhone Duo jump ahead from the Z Fold 8's 12 hours and 19 minute battery life based on that optimization alone. Though we'll obviously need to do some in-depth battery life testing before we can say for sure.</p><p>As for charging, expect the iPhone Duo to recharge faster. The 60W wired charging restores 50% charge in just 15 minutes and you get 25W wireless charging. The Z Fold 8 only has 45W wired charging and 20W wireless charging, which allows it to regain 43% in 15 minutes.</p><p>That's not a huge difference, but Apple has the edge. Plus, only the iiPhone Duo offers MagSafe charging.</p><h3 class="article-body__section" id="section-iphone-duo-vs-samsung-galaxy-z-fold-8-outlook"><span>iPhone Duo vs Samsung Galaxy Z Fold 8: Outlook</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AnoVUix3XWR3icSBBfRFFg" name="Z Fold 8 vs iPhone Duo" alt="Galaxy Z Fold 8 vs iPhone duo" src="https://cdn.mos.cms.futurecdn.net/AnoVUix3XWR3icSBBfRFFg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>We sill need to test the iPhone Duo to see how well the software works and how long the battery life is . But based on our hands-on impressions and everything we know so far, Apple should give Samsung some real competition. </p><p>The iPhone Duo has some notable advantages, including its IP68 durability, powerful A20 chip and, an even less visible crease, MagSafe and Apple Pencil support and faster charging.</p><p>The Galaxy Z Fold 8 is $100 less than the iPhone Duo; it comes in a thinner and lighter design, and it has better for multitasking. We also can't ignore the fact that this is Apple's first attempt at a foldable phone, while Samsung is currently on its eighth generation. </p><p>Stay tuned for our in-depth face-of to declare a winner.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-exclusive-apple-ceo-john-ternus-variable-aperture-camera">iPhone 18 Pro Exclusive: Apple CEO John Ternus on why the new variable aperture camera is the ‘best of both worlds’</a></li><li><a href="https://www.tomsguide.com/phones/iphones/ios-27-7-features-you-need-to-try-first-after-updating">iOS 27: 7 features you need to try first after updating</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-vs-iphone-14-pro-max-all-the-differences-and-should-you-upgrade">iPhone 18 Pro Max vs iPhone 14 Pro Max: All the differences and should you upgrade?</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Fold 8 vs iPhone Duo — 7 ways Samsung's wider foldable beats Apple ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8 </a>has been a strong reminder of why Samsung has been able to dominate the foldable phone market for so long. While it's true the company hasn't had a lot of competition, the fresh new form factor of the Fold 8 seems to have reinvigorated the interest in Galaxy foldables — just in time for Apple to jump onto the foldable bandwagon with the iPhone Duo.</p><p>The simple fact that this is a foldable iPhone means the Duo has the potential to offer Samsung the first serious competition for several years. The phone hasn't even been released yet, and we've already identified key <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-7-ways-apples-foldable-beats-its-rival-from-ip68-to-faster-charging-and-more">ways that the iPhone Duo beats the similarly-styled Galaxy Z Fold 8</a>. But what about the other way round? </p><p>Samsung has almost a decade of foldable experience, and that shows in the ways its latest release compares to Apple's first attempt. Here are seven ways the Galaxy Z Fold 8 beats the iPhone Duo.</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/2qNfOa5AuVU" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-it-s-lighter-and-thinner"><span>It's lighter and thinner</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:2693px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="xsfHUrdQAp5k99yND4fgSY" name="Galaxy Z Fold 8 review-26" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xsfHUrdQAp5k99yND4fgSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2693" height="1515" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Rumors suggested that the iPhone Duo would be the thinnest phone Apple has ever built, at<a href="https://www.tomsguide.com/phones/iphones/the-iphone-ultra-will-be-the-thinnest-iphone-ever-heres-how-it-will-stack-up-to-other-foldables"> 4.5mm (0.17-inches) thick when unfolded</a>. That wasn't the case, and we now know that the iPhone Duo is 5.2mm (0.2 inches) thick — which is slightly less than the 5.6mm iPhone Air. </p><p>Meanwhile the Galaxy Z Fold 8 really is 4.5mm thick when it's unfolded, making it one of the thinnest phones you can go out and buy. It's also much lighter than the iPhone Duo, weighing 201 grams (7.09 ounces) to Apple's 254 grams (8.96 ounces). That weight actually <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-tipped-to-be-heaviest-iphone-ever-heres-3-reasons-why-thats-a-good-thing">makes the Duo one of the heaviest iPhones Apple has ever released</a>. </p><p>The difference between the two may not seem like much, it does mean that the Z Fold 8 is likely to be more comfortable to use.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><h3 class="article-body__section" id="section-a-cheaper-price-tag"><span>A cheaper price tag</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:2332px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="SzqLLphnRAA8Pka8QDDMCZ" name="Galaxy Z Fold 8 review-11" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/SzqLLphnRAA8Pka8QDDMCZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2332" height="1312" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Foldable phones are not cheap, with both the Galaxy Z Fold 8 and iPhone Duo costing several hundred dollars more than their non-folding counterparts. But when it comes to the actual asking price, Samsung has the edge.</p><p>The cheapest Samsung Galaxy Z Fold 8 is $1,899, which gets you a model with 256GB of storage and 12GB of RAM. Apple's cheapest iPhone Duo offers the same level of memory and storage, but it costs $1,999 — $100 more.</p><p>That price disparity sticks around for the 512GB and 1TB options as well. Samsung charges $2,099 and $2,499, respectively, while Apple's prices are both $100 more at $2,199 and $2,599. Samsung doesn't offer a 2TB storage option; the 2TB Duo comes in at $3,199.</p><h3 class="article-body__section" id="section-better-multitasking"><span>Better multitasking</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:2990px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RaSYsGcZBSQJkWkCfWgBgW" name="Galaxy Z Fold 8-16" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/RaSYsGcZBSQJkWkCfWgBgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2990" height="1682" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p><a href="https://www.tomsguide.com/phones/iphones/ive-tested-the-galaxy-z-fold-8-and-it-proves-apple-really-needs-to-solve-this-one-thing">Multitasking has never been Apple's strong suit,</a> especially on the iPhone, and it looks like iPhone Duo won't be at quite the same level as the Galaxy Z Fold 8.</p><p>The Z Fold 8 supports up to three windows at once, as well as five floating app windows that can sit wherever you like on screen. This is also possible on Apple's iPads, but iPhone Duo only supports two Split View windows at a time.</p><p>Considering one of the benefits of iPhone Duo is the ability to carry an iPad-like device in your pocket, the limited nature of Split View means you're missing out on an important productivity feature other devices have offered for years.</p><h3 class="article-body__section" id="section-dex"><span>DeX</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:5276px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AieHmWF2DYNhYEc6WiBT4n" name="Samsung DeX on Galaxy Z Flip 8" alt="Samsung DeX on Galaxy Z Flip 8." src="https://cdn.mos.cms.futurecdn.net/AieHmWF2DYNhYEc6WiBT4n-1920-80.jpg" mos="" align="middle" fullscreen="" width="5276" height="2968" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>While desktop modes have slowly started making a comeback on Android phones, Apple has always seen fit to completely ignore them. The Z Fold 8 offers <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">Samsung's DeX desktop mode</a>, while the iPhone Duo lacks any sort of equivalent feature.</p><p>The idea behind DeX is that you plug your Galaxy phone into a monitor, at which point the phone loads up a desktop-like UI on the larger screen. That way you can use your phone as a desktop computer, without needing to carry around a laptop or tablet everywhere you go. </p><p>It's a fairly niche feature, and it's reliant on having access to a spare display. But it is a way to get more use out of a Z Fold 8, and put all the performance hardware to good use. It's unfortunate that the iPhone Duo is limited to its own display and UI.</p><h3 class="article-body__section" id="section-physical-sim-slot"><span>Physical SIM slot</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="Z4xNVatT98sDPTLnax5YtC" name="GettyImages-921346060.jpg" alt="eSIM" src="https://cdn.mos.cms.futurecdn.net/Z4xNVatT98sDPTLnax5YtC-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1687" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AndreyPopov)</span></figcaption></figure><p>Apple has been betting big on eSIMs in recent years, and some regions (including the U.S.) <a href="https://www.tomsguide.com/phones/iphones/iphone-17-and-iphone-air-are-latest-phones-to-push-esim-heres-why-i-dont-want-to-give-up-physical-sim-cards">can't use physical SIM cards in newer models of iPhone.</a> </p><p>Sadly, while European versions of the iPhone 18 Pro still come with a physical SIM card slot, that won't be the case with iPhone Duo. Apple has confirmed that the phone will be eSIM only all around the world. So no matter where you live, there's zero opportunity to use a physical nano SIM card.</p><p>The Galaxy Z Fold 8 still supports both eSIM and physical SIM cards, which gives users a lot more choice and flexibility. It's pretty small in the grand scheme of things, but as someone that has to swap phones fairly often, the process of transferring eSIMs to a new device is nowhere near as simple as swapping a physical card between devices. </p><h3 class="article-body__section" id="section-16gb-ram-option"><span>16GB RAM option</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3508px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="CnV2R6YCsPFej5e7GpiWfZ" name="Galaxy Z Fold 8 review-24" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/CnV2R6YCsPFej5e7GpiWfZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3508" height="1973" attribution="" endorsement="" class="inline"></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 iPhone Duo comes with 12GB of RAM no matter which storage variant you get. Samsung starts off by offering 12GB on its cheapest models, but those buying the 1TB storage option will actually get an additional 4GB of RAM thrown in — for a total of 16GB.</p><p>Why does that matter? It all comes down to why memory prices have been skyrocketing over the past year: AI processing. AI features are heavily reliant on RAM, and generally speaking the more memory that's available, the faster things will run. That's particularly important for on-device AI processing, which is faster and more secure than offloading those tasks to the cloud.</p><p>Historically iPhones haven't needed as much RAM as Android phones, on account of the strong links between Apple's hardware and software. But not even Apple can bypass AI's need for memory, and we'll have to wait and see how the Duo (and A20 Pro chipset) performs in AI benchmarking tests before we can say how much better or worse it could have been with more RAM.</p><h3 class="article-body__section" id="section-8k-video-recording"><span>8K video recording</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="F6qr2SDN3gLqxsmgpqVYsY" name="Fold 8 back 2" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/F6qr2SDN3gLqxsmgpqVYsY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The iPhone Duo is no slouch in the camera department, at least not as far as we can tell from the specs and limited hands-on time. While the actual camera hardware looks fairly similar to that of the Z Fold 8 (48MP main lenses compared to 50MP), there is one thing Samsung has a leg up on — ultra-high-resolution video recording.</p><p>Like many Samsung flagships, the Z Fold 8 is capable of recording video at 8k resolution at 30 frames per second or 4K resolution at 120fps. Meanwhile, the iPhone Duo is capped at 4K resolution video recording, with frame rates of 120fps on the main camera and 60fps on the ultrawide.</p><p>Admittedly, the opportunities to play 8K video are pretty slim for the average phone user — so recording in such high resolution is just a waste of storage space. But it is a key area in which Samsung outpaces Apple, which might be important to you.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-battery-capacity-confirmed-in-europe-heres-how-they-compare-to-iphone-17-pro">iPhone 18 Pro and Pro Max battery capacity confirmed in Europe — here's how they compare to iPhone 17 Pro</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apples-just-extended-free-access-to-emergency-satellite-communication-for-another-year-its-the-third-time-this-has-happened">Apple's just extended free access to emergency satellite communication for another year — it's the third time this has happened</a></li><li><a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it">Steve Jobs said there would never be an iPhone stylus but iPhone Duo just proved him wrong — and it'll be a better device for it</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-vs-iphone-duo-7-ways-samsungs-wider-foldable-beats-apple</link>
                                                                            <description>
                            <![CDATA[ Samsung has almost a decade of foldable experience; here's how the Galaxy Z fold 8 beats iPhone Duo in a few key ways ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">xx4meTm6QL3AcNUSs7aMoj</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AnoVUix3XWR3icSBBfRFFg-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 13 Sep 2026 09:30:00 +0000</pubDate>                                                                                                                                <updated>Mon, 14 Sep 2026 14:30:09 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AnoVUix3XWR3icSBBfRFFg-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 vs iPhone duo]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 vs iPhone duo]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 vs iPhone duo]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AnoVUix3XWR3icSBBfRFFg-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8 </a>has been a strong reminder of why Samsung has been able to dominate the foldable phone market for so long. While it's true the company hasn't had a lot of competition, the fresh new form factor of the Fold 8 seems to have reinvigorated the interest in Galaxy foldables — just in time for Apple to jump onto the foldable bandwagon with the iPhone Duo.</p><p>The simple fact that this is a foldable iPhone means the Duo has the potential to offer Samsung the first serious competition for several years. The phone hasn't even been released yet, and we've already identified key <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-7-ways-apples-foldable-beats-its-rival-from-ip68-to-faster-charging-and-more">ways that the iPhone Duo beats the similarly-styled Galaxy Z Fold 8</a>. But what about the other way round? </p><p>Samsung has almost a decade of foldable experience, and that shows in the ways its latest release compares to Apple's first attempt. Here are seven ways the Galaxy Z Fold 8 beats the iPhone Duo.</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/2qNfOa5AuVU" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-it-s-lighter-and-thinner"><span>It's lighter and thinner</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:2693px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="xsfHUrdQAp5k99yND4fgSY" name="Galaxy Z Fold 8 review-26" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xsfHUrdQAp5k99yND4fgSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2693" height="1515" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Rumors suggested that the iPhone Duo would be the thinnest phone Apple has ever built, at<a href="https://www.tomsguide.com/phones/iphones/the-iphone-ultra-will-be-the-thinnest-iphone-ever-heres-how-it-will-stack-up-to-other-foldables"> 4.5mm (0.17-inches) thick when unfolded</a>. That wasn't the case, and we now know that the iPhone Duo is 5.2mm (0.2 inches) thick — which is slightly less than the 5.6mm iPhone Air. </p><p>Meanwhile the Galaxy Z Fold 8 really is 4.5mm thick when it's unfolded, making it one of the thinnest phones you can go out and buy. It's also much lighter than the iPhone Duo, weighing 201 grams (7.09 ounces) to Apple's 254 grams (8.96 ounces). That weight actually <a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-max-tipped-to-be-heaviest-iphone-ever-heres-3-reasons-why-thats-a-good-thing">makes the Duo one of the heaviest iPhones Apple has ever released</a>. </p><p>The difference between the two may not seem like much, it does mean that the Z Fold 8 is likely to be more comfortable to use.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><h3 class="article-body__section" id="section-a-cheaper-price-tag"><span>A cheaper price tag</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:2332px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="SzqLLphnRAA8Pka8QDDMCZ" name="Galaxy Z Fold 8 review-11" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/SzqLLphnRAA8Pka8QDDMCZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2332" height="1312" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Foldable phones are not cheap, with both the Galaxy Z Fold 8 and iPhone Duo costing several hundred dollars more than their non-folding counterparts. But when it comes to the actual asking price, Samsung has the edge.</p><p>The cheapest Samsung Galaxy Z Fold 8 is $1,899, which gets you a model with 256GB of storage and 12GB of RAM. Apple's cheapest iPhone Duo offers the same level of memory and storage, but it costs $1,999 — $100 more.</p><p>That price disparity sticks around for the 512GB and 1TB options as well. Samsung charges $2,099 and $2,499, respectively, while Apple's prices are both $100 more at $2,199 and $2,599. Samsung doesn't offer a 2TB storage option; the 2TB Duo comes in at $3,199.</p><h3 class="article-body__section" id="section-better-multitasking"><span>Better multitasking</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:2990px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RaSYsGcZBSQJkWkCfWgBgW" name="Galaxy Z Fold 8-16" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/RaSYsGcZBSQJkWkCfWgBgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2990" height="1682" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p><a href="https://www.tomsguide.com/phones/iphones/ive-tested-the-galaxy-z-fold-8-and-it-proves-apple-really-needs-to-solve-this-one-thing">Multitasking has never been Apple's strong suit,</a> especially on the iPhone, and it looks like iPhone Duo won't be at quite the same level as the Galaxy Z Fold 8.</p><p>The Z Fold 8 supports up to three windows at once, as well as five floating app windows that can sit wherever you like on screen. This is also possible on Apple's iPads, but iPhone Duo only supports two Split View windows at a time.</p><p>Considering one of the benefits of iPhone Duo is the ability to carry an iPad-like device in your pocket, the limited nature of Split View means you're missing out on an important productivity feature other devices have offered for years.</p><h3 class="article-body__section" id="section-dex"><span>DeX</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:5276px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AieHmWF2DYNhYEc6WiBT4n" name="Samsung DeX on Galaxy Z Flip 8" alt="Samsung DeX on Galaxy Z Flip 8." src="https://cdn.mos.cms.futurecdn.net/AieHmWF2DYNhYEc6WiBT4n-1920-80.jpg" mos="" align="middle" fullscreen="" width="5276" height="2968" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>While desktop modes have slowly started making a comeback on Android phones, Apple has always seen fit to completely ignore them. The Z Fold 8 offers <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">Samsung's DeX desktop mode</a>, while the iPhone Duo lacks any sort of equivalent feature.</p><p>The idea behind DeX is that you plug your Galaxy phone into a monitor, at which point the phone loads up a desktop-like UI on the larger screen. That way you can use your phone as a desktop computer, without needing to carry around a laptop or tablet everywhere you go. </p><p>It's a fairly niche feature, and it's reliant on having access to a spare display. But it is a way to get more use out of a Z Fold 8, and put all the performance hardware to good use. It's unfortunate that the iPhone Duo is limited to its own display and UI.</p><h3 class="article-body__section" id="section-physical-sim-slot"><span>Physical SIM slot</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3000px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="Z4xNVatT98sDPTLnax5YtC" name="GettyImages-921346060.jpg" alt="eSIM" src="https://cdn.mos.cms.futurecdn.net/Z4xNVatT98sDPTLnax5YtC-1920-80.jpg" mos="" align="middle" fullscreen="" width="3000" height="1687" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: AndreyPopov)</span></figcaption></figure><p>Apple has been betting big on eSIMs in recent years, and some regions (including the U.S.) <a href="https://www.tomsguide.com/phones/iphones/iphone-17-and-iphone-air-are-latest-phones-to-push-esim-heres-why-i-dont-want-to-give-up-physical-sim-cards">can't use physical SIM cards in newer models of iPhone.</a> </p><p>Sadly, while European versions of the iPhone 18 Pro still come with a physical SIM card slot, that won't be the case with iPhone Duo. Apple has confirmed that the phone will be eSIM only all around the world. So no matter where you live, there's zero opportunity to use a physical nano SIM card.</p><p>The Galaxy Z Fold 8 still supports both eSIM and physical SIM cards, which gives users a lot more choice and flexibility. It's pretty small in the grand scheme of things, but as someone that has to swap phones fairly often, the process of transferring eSIMs to a new device is nowhere near as simple as swapping a physical card between devices. </p><h3 class="article-body__section" id="section-16gb-ram-option"><span>16GB RAM option</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3508px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="CnV2R6YCsPFej5e7GpiWfZ" name="Galaxy Z Fold 8 review-24" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/CnV2R6YCsPFej5e7GpiWfZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3508" height="1973" attribution="" endorsement="" class="inline"></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 iPhone Duo comes with 12GB of RAM no matter which storage variant you get. Samsung starts off by offering 12GB on its cheapest models, but those buying the 1TB storage option will actually get an additional 4GB of RAM thrown in — for a total of 16GB.</p><p>Why does that matter? It all comes down to why memory prices have been skyrocketing over the past year: AI processing. AI features are heavily reliant on RAM, and generally speaking the more memory that's available, the faster things will run. That's particularly important for on-device AI processing, which is faster and more secure than offloading those tasks to the cloud.</p><p>Historically iPhones haven't needed as much RAM as Android phones, on account of the strong links between Apple's hardware and software. But not even Apple can bypass AI's need for memory, and we'll have to wait and see how the Duo (and A20 Pro chipset) performs in AI benchmarking tests before we can say how much better or worse it could have been with more RAM.</p><h3 class="article-body__section" id="section-8k-video-recording"><span>8K video recording</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="F6qr2SDN3gLqxsmgpqVYsY" name="Fold 8 back 2" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/F6qr2SDN3gLqxsmgpqVYsY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The iPhone Duo is no slouch in the camera department, at least not as far as we can tell from the specs and limited hands-on time. While the actual camera hardware looks fairly similar to that of the Z Fold 8 (48MP main lenses compared to 50MP), there is one thing Samsung has a leg up on — ultra-high-resolution video recording.</p><p>Like many Samsung flagships, the Z Fold 8 is capable of recording video at 8k resolution at 30 frames per second or 4K resolution at 120fps. Meanwhile, the iPhone Duo is capped at 4K resolution video recording, with frame rates of 120fps on the main camera and 60fps on the ultrawide.</p><p>Admittedly, the opportunities to play 8K video are pretty slim for the average phone user — so recording in such high resolution is just a waste of storage space. But it is a key area in which Samsung outpaces Apple, which might be important to you.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/iphone-18-pro-and-pro-max-battery-capacity-confirmed-in-europe-heres-how-they-compare-to-iphone-17-pro">iPhone 18 Pro and Pro Max battery capacity confirmed in Europe — here's how they compare to iPhone 17 Pro</a></li><li><a href="https://www.tomsguide.com/phones/iphones/apples-just-extended-free-access-to-emergency-satellite-communication-for-another-year-its-the-third-time-this-has-happened">Apple's just extended free access to emergency satellite communication for another year — it's the third time this has happened</a></li><li><a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it">Steve Jobs said there would never be an iPhone stylus but iPhone Duo just proved him wrong — and it'll be a better device for it</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Duo vs Galaxy Z Fold 8 — 7 ways Apple beats Samsung's foldable ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The launch of <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> is a big deal. This is the first ever foldable developed by Apple, and for that reason alone it has the chance to dethrone Samsung as the king of the foldable phone space. But it also helps that Apple has produced a phone with a lot of great qualities, and will naturally lead to comparisons with the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8</a>.</p><p>The two phones are similar in a bunch of ways, including their wider, passport-inspired design. However, there are a number of key ways Apple has improved on the foldable design, and beaten Samsung at its own game. Considering this is Apple's first foldable, that might just make the extended development time worth it. Here are seven ways iPhone Duo actually beats the Galaxy Z Fold 8.</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/2qNfOa5AuVU" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-ip68-rating"><span>IP68 rating</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="i4QF9zqZdmy4sZPuE8hXFa" name="iphone duo edit 4" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/i4QF9zqZdmy4sZPuE8hXFa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Google proved that a foldable could get an IP68 water and dust resistance rating with last year's <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Pixel 10 Pro Fold</a>. This means that, despite all the moving parts around the hinge, Google was able to seal the phone up and ensure dust and other foreign particles can't get inside. Apple continued that trend by also sealing the iPhone Duo up to the same IP68 standard.</p><p>Meanwhile the Galaxy Z Fold 8 is only rated to IP48. The 8 means that it's water-tight, capable of being submerged in up to a meter of water for up to 30 minutes — just like Google and Apple. However, the 4 means that the Z Fold 8 offers no protection against dust, or any other particles larger than one millimeter (0.04 inches).</p><p>In other words, there's a whole bunch of nasty stuff that could get inside the Z Fold 8 and cause problems — and you might not even realize it. In other words, you should be able to take the iPhone Duo to the beach.</p><h3 class="article-body__section" id="section-apple-pencil-support"><span>Apple Pencil support</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="utmMc9q6LHmFEEaQK8rvhB" name="iPhone Duo apple pencil" alt="iPhone Duo with Apple Pencil" src="https://cdn.mos.cms.futurecdn.net/utmMc9q6LHmFEEaQK8rvhB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Samsung used to sell foldables that supported the S Pen stylus, but the last one to be released was 2024's<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-6-review-test-results"> Galaxy Z Fold 6.</a> From the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Z Fold 7 </a>onwards, Samsung stripped out the S Pen functionality, removing a critical part of the display makeup in order to reduce the phone's thickness. This means that the Z Fold 8 does not support any kind of active stylus. </p><p>Meanwhile, the <a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it">iPhone Duo not only offers stylus support</a>, it's compatible with the <a href="https://www.tomsguide.com/hands-on/apple-pencil-usb-c-hands-on-is-this-pen-mightier">Apple Pencil USB-C</a> — which works with the majority of iPads still on sale. Samsung needed a special kind of S Pen for the foldable screen, but the iPhone Duo uses a stylus that you may already have.</p><p>It's the most basic Apple stylus on sale, and it lacks key features you'll find on the <a href="https://www.tomsguide.com/tablets/ipads/apple-announces-apple-pencil-pro-with-barrel-roll-and-squeeze-capabilities">Apple Pencil Pro</a>, but it's better than nothing.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><h3 class="article-body__section" id="section-magsafe"><span>MagSafe</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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Magnetic wireless charging is a rarity, in part because Apple had a stranglehold on it for so long. While <a href="https://www.tomsguide.com/phones/what-is-qi2-wireless-charging">Qi2 wireless charging</a> does allow phones to add a MagSafe-style magnetic ring, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-has-supports-qi2-charging-but-theres-a-big-catch">Samsung has avoided doing this </a>— preferring to utilize special magnetic cases instead. The Galaxy Z Fold 8 is no exception to this trend, despite offering all the other benefits of Qi2 charging.</p><p>Apple had no such issue adding <a href="https://www.tomsguide.com/phones/iphones/what-is-apple-magsafe-and-which-iphones-support-it">MagSafe</a> to the iPhone Duo, as it's done with virtually every iPhone released since the <a href="https://www.tomsguide.com/reviews/iphone-12">iPhone 12.</a> Plus, despite the phone's unique shape and size, Apple confirmed that it is compatible with MagSafe accessories and chargers  — meaning all your old MagSafe products should still fit.</p><h3 class="article-body__section" id="section-faster-60w-charging"><span>Faster 60W charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2144px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4oMko37sfDNte8KzjvzD2M" name="Apple iPhone Duo hands on-3" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/4oMko37sfDNte8KzjvzD2M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2144" height="1206" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>MagSafe isn't the only way iPhone Duo beats Z Fold 8 in the charging department. Apple's foldable also offers faster charging speeds, regardless of whether you use MagSafe or a plug-in charging cable.</p><p>Wired charging supports up to 60W speeds, which regains 50% charge in just 15 minutes. Meanwhile, wireless charging is capped at 25W. In comparison, the Galaxy Z Fold 8 offers 45W wired charging, and can regain 43% in 15 minutes. Wireless charging is also slightly slower at 20W, which puts it at a slight disadvantage to the iPhone.</p><h3 class="article-body__section" id="section-better-front-facing-camera-hardware"><span>Better front-facing camera hardware</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="SoAi2j7o9Dqs6v288A4cEa" name="iPhone Duo edit 3" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/SoAi2j7o9Dqs6v288A4cEa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Like the S Pen, Samsung used to offer an <a href="https://www.tomsguide.com/news/samsung-galaxy-z-fold-3-under-display-camera-tested-its-amazing-and-flawed">under-display camera</a> on Galaxy Z Fold phones — and it hasn't been seen since the Galaxy Z Fold 6. The quality was not great, and it was no surprise that later Z folds switched back to the hole-punch camera design. Apple is giving under-display camera tech another chance at the limelight.</p><p>Apple hasn't specified the quality of this camera, noting that it's designed for use with FaceTime and other video calling software rather than selfies. That suggests the quality isn't great. But at least Apple is willing to try new things with the Duo, rather than reusing the same lackluster selfie camera hardware for multiple years in a row.</p><p>Plus, the iPhone Duo's actual selfie camera, which is in the cover display, offers higher resolution than Samsung. We're talking 12MP compared to 10MP, and while resolution doesn't automatically mean quality, it's likely that this is a similar selfie camera to the one in iPhone 17 Pro Max — <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">which I found to take better photos than the Galaxy Z Fold 8 Ultra.</a></p><h3 class="article-body__section" id="section-iphone-duo-software-reacts-based-on-folded-hinge-state"><span>iPhone Duo software reacts based on folded hinge state</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="N49opwHV76RM3BfKvL8REa" name="iPhone duo edit 2" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/N49opwHV76RM3BfKvL8REa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>A lot of Samsung phones offer what the company calls "Flex Mode," which allows the phone to react and adapt depending on the angle of the central hinge. Samsung Galaxy Z Fold 8 is the first Galaxy foldable to ditch this feature, despite the fact it's available on the Ultra model. This reduces the functionality of the phone somewhat, especially compared to iPhone Duo.</p><p>Apple doesn't have a special name for this feature, but the Duo does react depending on the angle of the hinge and the state of the fold itself. So if you have Netflix running, folding the screen to a 90-degree angle will shift the video to one side of the screen, and media controls to the other. </p><h3 class="article-body__section" id="section-vapor-chamber-cooling"><span>Vapor chamber cooling</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="CN7RzmKPJyev7oUAf2fdFa" name="iPhone duo gaming" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/CN7RzmKPJyev7oUAf2fdFa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The iPhone Duo offers an A20 Pro chipset with vapor chamber cooling, which helps dissipate heat. This means that the iPhone should offer better sustained performance, especially when doing resource-heavy tasks like gaming, multitasking and AI processing. </p><p>We haven't done any performance or thermal testing on the iPhone Duo just yet, so we don't know how effective the vapor chamber will be. That said, the Fold 8 doesn't offer a vapor chamber at all. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/apple-quietly-jacks-the-prices-of-the-iphone-16-iphone-17-and-iphone-air-heres-how-much-youll-pay-now"><strong>Apple quietly jacks the prices of the iPhone 16, iPhone 17, and iPhone Air — here's how much you'll pay now</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/apples-just-extended-free-access-to-emergency-satellite-communication-for-another-year-its-the-third-time-this-has-happened"><strong>Apple's just extended free access to emergency satellite communication for another year — it's the third time this has happened</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it"><strong>Steve Jobs said there would never be an iPhone stylus but iPhone Duo just proved him wrong — and it'll be a better device for it</strong></a><strong></strong></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-duo-vs-samsung-galaxy-z-fold-8-7-ways-apples-foldable-beats-its-rival-from-ip68-to-faster-charging-and-more</link>
                                                                            <description>
                            <![CDATA[ iPhone Duo may be the first Apple foldable, but it's already beating Samsung at its own game. Here are seven ways it beats the Galaxy Z Fold 8. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YMufsSbjwum9vd5JjKhXUQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 11 Sep 2026 07:30:00 +0000</pubDate>                                                                                                                                <updated>Fri, 11 Sep 2026 14:22:10 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:description>                                                            <media:text><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:text>
                                <media:title type="plain"><![CDATA[IPhone duo vs galaxy Z Fold 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NE3m4C3QUpw7U8uQfUAmea-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The launch of <a href="https://www.tomsguide.com/phones/iphones/iphone-duo-hands-on-apple-nailed-it-and-just-put-everyone-else-on-notice">iPhone Duo</a> is a big deal. This is the first ever foldable developed by Apple, and for that reason alone it has the chance to dethrone Samsung as the king of the foldable phone space. But it also helps that Apple has produced a phone with a lot of great qualities, and will naturally lead to comparisons with the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8</a>.</p><p>The two phones are similar in a bunch of ways, including their wider, passport-inspired design. However, there are a number of key ways Apple has improved on the foldable design, and beaten Samsung at its own game. Considering this is Apple's first foldable, that might just make the extended development time worth it. Here are seven ways iPhone Duo actually beats the Galaxy Z Fold 8.</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/2qNfOa5AuVU" allowfullscreen></iframe></div></div><h3 class="article-body__section" id="section-ip68-rating"><span>IP68 rating</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="i4QF9zqZdmy4sZPuE8hXFa" name="iphone duo edit 4" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/i4QF9zqZdmy4sZPuE8hXFa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Google proved that a foldable could get an IP68 water and dust resistance rating with last year's <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Pixel 10 Pro Fold</a>. This means that, despite all the moving parts around the hinge, Google was able to seal the phone up and ensure dust and other foreign particles can't get inside. Apple continued that trend by also sealing the iPhone Duo up to the same IP68 standard.</p><p>Meanwhile the Galaxy Z Fold 8 is only rated to IP48. The 8 means that it's water-tight, capable of being submerged in up to a meter of water for up to 30 minutes — just like Google and Apple. However, the 4 means that the Z Fold 8 offers no protection against dust, or any other particles larger than one millimeter (0.04 inches).</p><p>In other words, there's a whole bunch of nasty stuff that could get inside the Z Fold 8 and cause problems — and you might not even realize it. In other words, you should be able to take the iPhone Duo to the beach.</p><h3 class="article-body__section" id="section-apple-pencil-support"><span>Apple Pencil support</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="utmMc9q6LHmFEEaQK8rvhB" name="iPhone Duo apple pencil" alt="iPhone Duo with Apple Pencil" src="https://cdn.mos.cms.futurecdn.net/utmMc9q6LHmFEEaQK8rvhB-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple)</span></figcaption></figure><p>Samsung used to sell foldables that supported the S Pen stylus, but the last one to be released was 2024's<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-6-review-test-results"> Galaxy Z Fold 6.</a> From the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Z Fold 7 </a>onwards, Samsung stripped out the S Pen functionality, removing a critical part of the display makeup in order to reduce the phone's thickness. This means that the Z Fold 8 does not support any kind of active stylus. </p><p>Meanwhile, the <a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it">iPhone Duo not only offers stylus support</a>, it's compatible with the <a href="https://www.tomsguide.com/hands-on/apple-pencil-usb-c-hands-on-is-this-pen-mightier">Apple Pencil USB-C</a> — which works with the majority of iPads still on sale. Samsung needed a special kind of S Pen for the foldable screen, but the iPhone Duo uses a stylus that you may already have.</p><p>It's the most basic Apple stylus on sale, and it lacks key features you'll find on the <a href="https://www.tomsguide.com/tablets/ipads/apple-announces-apple-pencil-pro-with-barrel-roll-and-squeeze-capabilities">Apple Pencil Pro</a>, but it's better than nothing.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exgNKX"></div>                            </div>                            <script src="https://kwizly.com/embed/exgNKX.js" async></script><h3 class="article-body__section" id="section-magsafe"><span>MagSafe</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="UDr8c5DLF9rP5aXyr9NwQ5" name="iphone duo software" alt="iphone duo two apps" src="https://cdn.mos.cms.futurecdn.net/UDr8c5DLF9rP5aXyr9NwQ5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Magnetic wireless charging is a rarity, in part because Apple had a stranglehold on it for so long. While <a href="https://www.tomsguide.com/phones/what-is-qi2-wireless-charging">Qi2 wireless charging</a> does allow phones to add a MagSafe-style magnetic ring, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-has-supports-qi2-charging-but-theres-a-big-catch">Samsung has avoided doing this </a>— preferring to utilize special magnetic cases instead. The Galaxy Z Fold 8 is no exception to this trend, despite offering all the other benefits of Qi2 charging.</p><p>Apple had no such issue adding <a href="https://www.tomsguide.com/phones/iphones/what-is-apple-magsafe-and-which-iphones-support-it">MagSafe</a> to the iPhone Duo, as it's done with virtually every iPhone released since the <a href="https://www.tomsguide.com/reviews/iphone-12">iPhone 12.</a> Plus, despite the phone's unique shape and size, Apple confirmed that it is compatible with MagSafe accessories and chargers  — meaning all your old MagSafe products should still fit.</p><h3 class="article-body__section" id="section-faster-60w-charging"><span>Faster 60W charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2144px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4oMko37sfDNte8KzjvzD2M" name="Apple iPhone Duo hands on-3" alt="Apple iPhone Duo shown in hand" src="https://cdn.mos.cms.futurecdn.net/4oMko37sfDNte8KzjvzD2M-1920-80.jpg" mos="" align="middle" fullscreen="" width="2144" height="1206" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>MagSafe isn't the only way iPhone Duo beats Z Fold 8 in the charging department. Apple's foldable also offers faster charging speeds, regardless of whether you use MagSafe or a plug-in charging cable.</p><p>Wired charging supports up to 60W speeds, which regains 50% charge in just 15 minutes. Meanwhile, wireless charging is capped at 25W. In comparison, the Galaxy Z Fold 8 offers 45W wired charging, and can regain 43% in 15 minutes. Wireless charging is also slightly slower at 20W, which puts it at a slight disadvantage to the iPhone.</p><h3 class="article-body__section" id="section-better-front-facing-camera-hardware"><span>Better front-facing camera hardware</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="SoAi2j7o9Dqs6v288A4cEa" name="iPhone Duo edit 3" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/SoAi2j7o9Dqs6v288A4cEa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Like the S Pen, Samsung used to offer an <a href="https://www.tomsguide.com/news/samsung-galaxy-z-fold-3-under-display-camera-tested-its-amazing-and-flawed">under-display camera</a> on Galaxy Z Fold phones — and it hasn't been seen since the Galaxy Z Fold 6. The quality was not great, and it was no surprise that later Z folds switched back to the hole-punch camera design. Apple is giving under-display camera tech another chance at the limelight.</p><p>Apple hasn't specified the quality of this camera, noting that it's designed for use with FaceTime and other video calling software rather than selfies. That suggests the quality isn't great. But at least Apple is willing to try new things with the Duo, rather than reusing the same lackluster selfie camera hardware for multiple years in a row.</p><p>Plus, the iPhone Duo's actual selfie camera, which is in the cover display, offers higher resolution than Samsung. We're talking 12MP compared to 10MP, and while resolution doesn't automatically mean quality, it's likely that this is a similar selfie camera to the one in iPhone 17 Pro Max — <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">which I found to take better photos than the Galaxy Z Fold 8 Ultra.</a></p><h3 class="article-body__section" id="section-iphone-duo-software-reacts-based-on-folded-hinge-state"><span>iPhone Duo software reacts based on folded hinge state</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="N49opwHV76RM3BfKvL8REa" name="iPhone duo edit 2" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/N49opwHV76RM3BfKvL8REa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>A lot of Samsung phones offer what the company calls "Flex Mode," which allows the phone to react and adapt depending on the angle of the central hinge. Samsung Galaxy Z Fold 8 is the first Galaxy foldable to ditch this feature, despite the fact it's available on the Ultra model. This reduces the functionality of the phone somewhat, especially compared to iPhone Duo.</p><p>Apple doesn't have a special name for this feature, but the Duo does react depending on the angle of the hinge and the state of the fold itself. So if you have Netflix running, folding the screen to a 90-degree angle will shift the video to one side of the screen, and media controls to the other. </p><h3 class="article-body__section" id="section-vapor-chamber-cooling"><span>Vapor chamber cooling</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="CN7RzmKPJyev7oUAf2fdFa" name="iPhone duo gaming" alt="iPhone Duo" src="https://cdn.mos.cms.futurecdn.net/CN7RzmKPJyev7oUAf2fdFa-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The iPhone Duo offers an A20 Pro chipset with vapor chamber cooling, which helps dissipate heat. This means that the iPhone should offer better sustained performance, especially when doing resource-heavy tasks like gaming, multitasking and AI processing. </p><p>We haven't done any performance or thermal testing on the iPhone Duo just yet, so we don't know how effective the vapor chamber will be. That said, the Fold 8 doesn't offer a vapor chamber at all. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/apple-quietly-jacks-the-prices-of-the-iphone-16-iphone-17-and-iphone-air-heres-how-much-youll-pay-now"><strong>Apple quietly jacks the prices of the iPhone 16, iPhone 17, and iPhone Air — here's how much you'll pay now</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/apples-just-extended-free-access-to-emergency-satellite-communication-for-another-year-its-the-third-time-this-has-happened"><strong>Apple's just extended free access to emergency satellite communication for another year — it's the third time this has happened</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/iphones/steve-jobs-said-there-would-never-be-an-iphone-stylus-but-iphone-duo-just-proved-him-wrong-and-itll-be-a-better-device-for-it"><strong>Steve Jobs said there would never be an iPhone stylus but iPhone Duo just proved him wrong — and it'll be a better device for it</strong></a><strong></strong></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Ultra vs. Galaxy Z Fold 8 Ultra — here's the flagship foldable I'd recommend based on the rumors ]]></title>
                                                                                                <dc:content><![CDATA[ <p>This has been an amazing year for foldables. Now more than ever, fierce competition is forcing phone makers to innovate at a rapid pace. With the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a> poised to make its debut at Apple’s upcoming <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">“surprise and shine”</a> event in just over a week, it will no doubt go toe-to-toe against the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review#section-samsung-galaxy-z-fold-8-ultra-review-the-ups">Galaxy Z Fold 8 Ultra</a>.</p><p>That’s why I’m exploring the iPhone Ultra vs. Galaxy Z Fold 8 Ultra matchup, breaking down what the latest leaks and rumors reveal about Apple’s upcoming foldable. Then, I’ll detail how it stacks up against what I’ve tested and experienced with the Galaxy Z Fold 8 Ultra — all to see which one truly deserves the title of <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phone</a>.</p><h2 id="a-form-factor-preference">A form-factor preference</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2955px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="MrDnXiJSzcsUQ9GoBW5XEX" name="Galaxy Z Fold 8-28" alt="Galaxy Z Fold 8 and Z Fold 8 Ultra shown side to side." src="https://cdn.mos.cms.futurecdn.net/MrDnXiJSzcsUQ9GoBW5XEX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2955" height="1662" attribution="" endorsement="" class="inline"></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 first and arguably biggest difference between them is the form factor. While the Galaxy Z Fold 8 Ultra sets a high bar with its remarkably thin, lightweight build, ergonomics often come down to aspect ratio. The taller profile of Samsung's foldable line contrasts sharply with the broader, passport-like shape rumored for Apple's debut.</p><p>Leaks and renders indicate Apple is embracing a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-dummy-unit-leaks-and-im-not-sure-how-i-feel-about-this-design-heres-why">wider footprint for the iPhone Ultra</a>, which fundamentally changes day-to-day usability. When closed, that shorter, stouter profile should make one-handed operation far more comfortable, unlike the Galaxy Z Fold 8 Ultra, where reaching the top corners of the cover display remains a stretch. Unfolded, the iPhone Ultra’s rumored 4:3 main screen offers a natural, book-like canvas that excels for split-screen multitasking and reading.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CV8CramvBjfpAfueojWvvS" name="iPhone Fold mockup" alt="iPhone Fold 3D printed mockup showing front screen and back of device" src="https://cdn.mos.cms.futurecdn.net/CV8CramvBjfpAfueojWvvS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Subsy @ MakerWorld)</span></figcaption></figure><p>Dimensions will play a major role as well. While Apple is tipped to make the iPhone Ultra roughly 4.8mm thin when unfolded with a weight between 8.1 and 8.5 ounces, the Galaxy Z Fold 8 Ultra holds the edge on raw numbers at 4.22mm thin and just 7.8 ounces.</p><p>Even so, I’d gladly trade a fraction of a millimeter and a few grams for the iPhone Ultra’s broader silhouette and superior everyday practicality.</p><h2 id="crease-less-display-i-39-ll-believe-it-when-i-see-it">Crease-less display: I'll believe it when I see it</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1876px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="dAKjscCtnwCaSP4hgKFape" name="Galaxy Z Fold 8 Ultra-5" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/dAKjscCtnwCaSP4hgKFape-1920-80.jpg" mos="" align="middle" fullscreen="" width="1876" height="1055" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Eliminating the display crease has long been the holy grail of foldable engineering. While Samsung has steadily refined the technology with each generation, the seam still persists. Frankly, though, the Galaxy Z Fold 8 Ultra’s crease doesn't bother me — it has never hindered me from watching videos, multitasking, or running apps.</p><p>Rumors suggest Apple is attempting to achieve the impossible with a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-invisible-crease-sounds-great-but-this-is-the-feature-apple-cant-afford-to-ignore">virtually invisible crease on the iPhone Ultra</a>. If Apple genuinely manages to deliver a completely flat, crease-free panel out of the gate, it would be an engineering triumph that instantly resets industry benchmarks and puts every other foldable maker on notice.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cLJg47oNbZQTPJwitNVmte" name="iPhone Ultra half open Apple Track 1" alt="iPhone Ultra half folded in hand" src="https://cdn.mos.cms.futurecdn.net/cLJg47oNbZQTPJwitNVmte-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple Track)</span></figcaption></figure><p>Still, I can’t help questioning the physics of bending ultra-thin glass thousands of times without wear and tear eventually leaving a trace. More importantly, the practical reality is that absolute perfection simply <em>isn't </em>necessary.</p><p>Samsung has refined the Galaxy Z Fold 8 Ultra’s hinge and teardrop display structure so effectively that its shallow crease disappears when viewing the screen straight on. Sure, I can still feel a subtle dip under my finger or catch a stray reflection off-axis, but in everyday use, it’s far from a deal breaker.</p><p>If Apple pulls off a miracle, kudos to them  —but for most buyers, living with a minor crease is hardly a sacrifice.</p><h2 id="camera-versatility">Camera versatility</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3143px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zQ46AeP4vRip5VZLsQx77F" name="Galaxy Z Fold 8 Ultra review-4" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/zQ46AeP4vRip5VZLsQx77F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3143" height="1768" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When it comes to cameras, the Galaxy Z Fold 8 Ultra holds the upper hand in both hardware and software. Leaks strongly suggest the iPhone Ultra will settle for a dual-camera system — a 48MP main sensor paired with a 48MP ultrawide — leaving out a dedicated telephoto lens entirely.</p><p>I know first-hand that Apple’s computational photography and color science are stellar. Time after time in my photo shootouts, iPhones prove to be front leading contenders for the <a href="https://www.tomsguide.com/us/best-phone-cameras,review-2272.html">best camera phone</a> title. For effortless point-and-shoot reliability, Apple rarely misses.</p><p>However, the Galaxy Z Fold 8 Ultra offers the sheer versatility that serious photographers and mobile creators like me crave. Samsung didn't compromise on hardware, packing a triple-lens system headlined by a massive 200MP main sensor, a 50MP ultrawide, and a dedicated 10MP 3x telephoto lens. </p><p>That optical reach makes a noticeable difference when framing distant subjects without sacrificing clarity — something my colleagues demonstrated clearly in their <a href="https://www.tomsguide.com/phones/samsung-phones/how-ultra-are-the-galaxy-z-fold-8-ultras-cameras-i-put-them-to-the-test-against-the-galaxy-s26-ultra">Galaxy Z Fold 8 vs. Galaxy Z Fold 8 Ultra camera shootout</a>.</p><p>Beyond the lenses, Samsung’s software ecosystem provides a deeper roster of creative tools. Features like <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-just-did-the-impossible-with-the-galaxy-s26-ultra-i-cant-decide-which-of-these-two-new-features-i-like-more">Horizon Lock</a> keep action shots level during rapid movement, while full Pro Video and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-phones-have-a-hidden-camera-mode-and-its-totally-transformed-my-photos">Expert RAW modes</a> grant granular manual control over shutter speed, ISO, and white balance. While I have no doubt the iPhone Ultra will capture gorgeous images, the Z Fold 8 Ultra is the clear winner for creative flexibility.</p><h2 id="power-and-battery">Power and battery</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3384px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="DsnjPkJpoiWkgqzpb69L5F" name="Galaxy Z Fold 8 Ultra review-23" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/DsnjPkJpoiWkgqzpb69L5F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3384" height="1904" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Foldable phones are simply more demanding than your average slab, so performance can’t be shorthanded. I’ve seen how incredibly finessed Samsung’s foldable is with a Snapdragon 8 Elite for Galaxy running under the hood. Benchmark performance scores prove it’s already a beast, which puts pressure on Apple to succeed with its rumored, next-gen <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-a20-pro-chip-apples-first-2nm-processor-to-power-new-foldable-phone">A20 Pro chip</a> that's supposedly using a 2nm manufacturing process. I don’t doubt that the A20 Pro will give the Snapdragon 8 Elite Gen 5 a run for its money, but history has shown me this isn’t a significant buying decision.</p><p>What I will say, though, is the class-leading performance of the Z Fold 8 Ultra’s battery life. Packed with a 5,000 mAh battery, it sets a high bar for the iPhone Ultra because the Fold 8 Ultra recorded a time of <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off">14 hours and 33 minutes on Tom’s Guide’s battery drain test</a>. That’s more than 2 hours longer than what we recorded with the <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">Galaxy Z Fold 8</a>.</p><p>Apple’s reportedly going to lean on a split-battery design totaling around 4,883 mAh. While that capacity is slightly smaller than Samsung's cell, it’ll ultimately come down to Apple’s unmatched silicon efficiency and aggressive iOS background power management could level the playing field.</p><h2 id="the-true-dark-horse-is-the-software">The true dark horse is the software</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BwFTXNUWDT3Up6pYASCnEg" name="Galaxy Z Fold 8 Ultra-17" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/BwFTXNUWDT3Up6pYASCnEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While hardware upgrades often grab the headlines, software optimization remains the real battleground for foldables — and it’s where Apple could quietly land a major blow. Even after years of development, Google and Samsung still wrestle with app scaling across irregular foldable aspect ratios.</p><p>I know this first-hand from playing some of my favorite games. While a title might scale properly on the cover display, opening the main screen — or simply rotating the device — frequently produces stretched-out layouts that fail to showcase the true benefits of a foldable 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AVYypSVaahdG6ut8smhmHA" name="Galaxy Z Fold 7" alt="Galaxy Z Fold 7 review." src="https://cdn.mos.cms.futurecdn.net/AVYypSVaahdG6ut8smhmHA-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If Apple enforces its strict developer guidelines and leverages a familiar iPad-like aspect ratio, the iPhone Ultra could deliver seamless app scaling out of the gate, taking full advantage of every square millimeter.</p><p>Still, Samsung has proven that raw productivity remains its top priority. The Galaxy Z Fold 8 Ultra effortlessly runs up to four apps simultaneously, while <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">Samsung DeX</a> elevates the hardware into a true desktop-like workstation when connected to an external monitor. It sets a towering standard for mobile productivity — and I'm eager to see whether Apple can counter with a comparable multitasking solution.</p><h2 id="outlook">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LBXk5HHdP7Dq6ZSQVtvXFG" name="iPhone Ultra" alt="iPhone Ultra against colorful background." src="https://cdn.mos.cms.futurecdn.net/LBXk5HHdP7Dq6ZSQVtvXFG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Price will ultimately be the elephant in the room for this matchup. While the Galaxy Z Fold 8 Ultra already commands a staggering $2,099 premium, early leaks and analyst projections suggest the iPhone Ultra could blow past that threshold—potentially landing anywhere between $2,000 and upwards of $2,500. That’s an eye-watering figure that's difficult to stomach for any smartphone, regardless of pedigree.</p><p>Yet, if Apple executes on its core hardware and software promises, the iPhone Ultra might just justify that astronomical investment over Samsung’s latest flagship.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5AKnW"></div>                            </div>                            <script src="https://kwizly.com/embed/W5AKnW.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/phones/google-pixel-phones/ive-been-testing-pixel-11-pro-xl-for-a-week-heres-why-hilight-is-the-most-disappointing-new-feature">I've been testing Pixel 11 Pro XL for a week — here's why HiLight is the most disappointing new feature</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-tried-this-magsafe-game-controller-and-it-puts-other-bluetooth-gamepads-to-shame-plus-its-usd20-off-right-now">I tried this MagSafe game controller and it puts other Bluetooth gamepads to shame — plus it’s $20 off right now</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-design-leaked-and-it-could-cause-the-most-intense-wave-of-criticism-in-galaxy-history">Samsung Galaxy S27 Ultra design leaked — and it could cause ‘the most intense wave of criticism in Galaxy history’</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/iphones/iphone-ultra-vs-galaxy-z-fold-8-ultra-heres-the-flagship-foldable-id-recommend</link>
                                                                            <description>
                            <![CDATA[ I break down an iPhone Ultra vs. Galaxy Z Fold Ultra comparison to find out which foldable phone could earn my money as the better foldable device. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4nNY6HzmMCUbWQ5yyrukPe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NUTTQajf9ScAinbNhcFzUH-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 31 Aug 2026 05:00:00 +0000</pubDate>                                                                                                                                <updated>Mon, 31 Aug 2026 11:33:33 +0000</updated>
                                                                                                                                            <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/NUTTQajf9ScAinbNhcFzUH-1920-80.jpg">
                                                            <media:credit><![CDATA[Majin Bu via X / Tom&amp;#39;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[iPhone Ultra vs Galaxy Z Fold 8 Ultra]]></media:description>                                                            <media:text><![CDATA[iPhone Ultra vs Galaxy Z Fold 8 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[iPhone Ultra vs Galaxy Z Fold 8 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NUTTQajf9ScAinbNhcFzUH-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>This has been an amazing year for foldables. Now more than ever, fierce competition is forcing phone makers to innovate at a rapid pace. With the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra</a> poised to make its debut at Apple’s upcoming <a href="https://www.tomsguide.com/phones/iphones/apple-event-is-official-for-september-9-iphone-ultra-iphone-18-pro-max-watch-12-and-more">“surprise and shine”</a> event in just over a week, it will no doubt go toe-to-toe against the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review#section-samsung-galaxy-z-fold-8-ultra-review-the-ups">Galaxy Z Fold 8 Ultra</a>.</p><p>That’s why I’m exploring the iPhone Ultra vs. Galaxy Z Fold 8 Ultra matchup, breaking down what the latest leaks and rumors reveal about Apple’s upcoming foldable. Then, I’ll detail how it stacks up against what I’ve tested and experienced with the Galaxy Z Fold 8 Ultra — all to see which one truly deserves the title of <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phone</a>.</p><h2 id="a-form-factor-preference">A form-factor preference</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2955px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="MrDnXiJSzcsUQ9GoBW5XEX" name="Galaxy Z Fold 8-28" alt="Galaxy Z Fold 8 and Z Fold 8 Ultra shown side to side." src="https://cdn.mos.cms.futurecdn.net/MrDnXiJSzcsUQ9GoBW5XEX-1920-80.jpg" mos="" align="middle" fullscreen="" width="2955" height="1662" attribution="" endorsement="" class="inline"></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 first and arguably biggest difference between them is the form factor. While the Galaxy Z Fold 8 Ultra sets a high bar with its remarkably thin, lightweight build, ergonomics often come down to aspect ratio. The taller profile of Samsung's foldable line contrasts sharply with the broader, passport-like shape rumored for Apple's debut.</p><p>Leaks and renders indicate Apple is embracing a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-dummy-unit-leaks-and-im-not-sure-how-i-feel-about-this-design-heres-why">wider footprint for the iPhone Ultra</a>, which fundamentally changes day-to-day usability. When closed, that shorter, stouter profile should make one-handed operation far more comfortable, unlike the Galaxy Z Fold 8 Ultra, where reaching the top corners of the cover display remains a stretch. Unfolded, the iPhone Ultra’s rumored 4:3 main screen offers a natural, book-like canvas that excels for split-screen multitasking and reading.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CV8CramvBjfpAfueojWvvS" name="iPhone Fold mockup" alt="iPhone Fold 3D printed mockup showing front screen and back of device" src="https://cdn.mos.cms.futurecdn.net/CV8CramvBjfpAfueojWvvS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Subsy @ MakerWorld)</span></figcaption></figure><p>Dimensions will play a major role as well. While Apple is tipped to make the iPhone Ultra roughly 4.8mm thin when unfolded with a weight between 8.1 and 8.5 ounces, the Galaxy Z Fold 8 Ultra holds the edge on raw numbers at 4.22mm thin and just 7.8 ounces.</p><p>Even so, I’d gladly trade a fraction of a millimeter and a few grams for the iPhone Ultra’s broader silhouette and superior everyday practicality.</p><h2 id="crease-less-display-i-39-ll-believe-it-when-i-see-it">Crease-less display: I'll believe it when I see it</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1876px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="dAKjscCtnwCaSP4hgKFape" name="Galaxy Z Fold 8 Ultra-5" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/dAKjscCtnwCaSP4hgKFape-1920-80.jpg" mos="" align="middle" fullscreen="" width="1876" height="1055" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Eliminating the display crease has long been the holy grail of foldable engineering. While Samsung has steadily refined the technology with each generation, the seam still persists. Frankly, though, the Galaxy Z Fold 8 Ultra’s crease doesn't bother me — it has never hindered me from watching videos, multitasking, or running apps.</p><p>Rumors suggest Apple is attempting to achieve the impossible with a <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-invisible-crease-sounds-great-but-this-is-the-feature-apple-cant-afford-to-ignore">virtually invisible crease on the iPhone Ultra</a>. If Apple genuinely manages to deliver a completely flat, crease-free panel out of the gate, it would be an engineering triumph that instantly resets industry benchmarks and puts every other foldable maker on notice.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cLJg47oNbZQTPJwitNVmte" name="iPhone Ultra half open Apple Track 1" alt="iPhone Ultra half folded in hand" src="https://cdn.mos.cms.futurecdn.net/cLJg47oNbZQTPJwitNVmte-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Apple Track)</span></figcaption></figure><p>Still, I can’t help questioning the physics of bending ultra-thin glass thousands of times without wear and tear eventually leaving a trace. More importantly, the practical reality is that absolute perfection simply <em>isn't </em>necessary.</p><p>Samsung has refined the Galaxy Z Fold 8 Ultra’s hinge and teardrop display structure so effectively that its shallow crease disappears when viewing the screen straight on. Sure, I can still feel a subtle dip under my finger or catch a stray reflection off-axis, but in everyday use, it’s far from a deal breaker.</p><p>If Apple pulls off a miracle, kudos to them  —but for most buyers, living with a minor crease is hardly a sacrifice.</p><h2 id="camera-versatility">Camera versatility</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3143px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zQ46AeP4vRip5VZLsQx77F" name="Galaxy Z Fold 8 Ultra review-4" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/zQ46AeP4vRip5VZLsQx77F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3143" height="1768" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When it comes to cameras, the Galaxy Z Fold 8 Ultra holds the upper hand in both hardware and software. Leaks strongly suggest the iPhone Ultra will settle for a dual-camera system — a 48MP main sensor paired with a 48MP ultrawide — leaving out a dedicated telephoto lens entirely.</p><p>I know first-hand that Apple’s computational photography and color science are stellar. Time after time in my photo shootouts, iPhones prove to be front leading contenders for the <a href="https://www.tomsguide.com/us/best-phone-cameras,review-2272.html">best camera phone</a> title. For effortless point-and-shoot reliability, Apple rarely misses.</p><p>However, the Galaxy Z Fold 8 Ultra offers the sheer versatility that serious photographers and mobile creators like me crave. Samsung didn't compromise on hardware, packing a triple-lens system headlined by a massive 200MP main sensor, a 50MP ultrawide, and a dedicated 10MP 3x telephoto lens. </p><p>That optical reach makes a noticeable difference when framing distant subjects without sacrificing clarity — something my colleagues demonstrated clearly in their <a href="https://www.tomsguide.com/phones/samsung-phones/how-ultra-are-the-galaxy-z-fold-8-ultras-cameras-i-put-them-to-the-test-against-the-galaxy-s26-ultra">Galaxy Z Fold 8 vs. Galaxy Z Fold 8 Ultra camera shootout</a>.</p><p>Beyond the lenses, Samsung’s software ecosystem provides a deeper roster of creative tools. Features like <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-just-did-the-impossible-with-the-galaxy-s26-ultra-i-cant-decide-which-of-these-two-new-features-i-like-more">Horizon Lock</a> keep action shots level during rapid movement, while full Pro Video and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-phones-have-a-hidden-camera-mode-and-its-totally-transformed-my-photos">Expert RAW modes</a> grant granular manual control over shutter speed, ISO, and white balance. While I have no doubt the iPhone Ultra will capture gorgeous images, the Z Fold 8 Ultra is the clear winner for creative flexibility.</p><h2 id="power-and-battery">Power and battery</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3384px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="DsnjPkJpoiWkgqzpb69L5F" name="Galaxy Z Fold 8 Ultra review-23" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/DsnjPkJpoiWkgqzpb69L5F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3384" height="1904" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Foldable phones are simply more demanding than your average slab, so performance can’t be shorthanded. I’ve seen how incredibly finessed Samsung’s foldable is with a Snapdragon 8 Elite for Galaxy running under the hood. Benchmark performance scores prove it’s already a beast, which puts pressure on Apple to succeed with its rumored, next-gen <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-for-a20-pro-chip-apples-first-2nm-processor-to-power-new-foldable-phone">A20 Pro chip</a> that's supposedly using a 2nm manufacturing process. I don’t doubt that the A20 Pro will give the Snapdragon 8 Elite Gen 5 a run for its money, but history has shown me this isn’t a significant buying decision.</p><p>What I will say, though, is the class-leading performance of the Z Fold 8 Ultra’s battery life. Packed with a 5,000 mAh battery, it sets a high bar for the iPhone Ultra because the Fold 8 Ultra recorded a time of <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off">14 hours and 33 minutes on Tom’s Guide’s battery drain test</a>. That’s more than 2 hours longer than what we recorded with the <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">Galaxy Z Fold 8</a>.</p><p>Apple’s reportedly going to lean on a split-battery design totaling around 4,883 mAh. While that capacity is slightly smaller than Samsung's cell, it’ll ultimately come down to Apple’s unmatched silicon efficiency and aggressive iOS background power management could level the playing field.</p><h2 id="the-true-dark-horse-is-the-software">The true dark horse is the software</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BwFTXNUWDT3Up6pYASCnEg" name="Galaxy Z Fold 8 Ultra-17" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/BwFTXNUWDT3Up6pYASCnEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While hardware upgrades often grab the headlines, software optimization remains the real battleground for foldables — and it’s where Apple could quietly land a major blow. Even after years of development, Google and Samsung still wrestle with app scaling across irregular foldable aspect ratios.</p><p>I know this first-hand from playing some of my favorite games. While a title might scale properly on the cover display, opening the main screen — or simply rotating the device — frequently produces stretched-out layouts that fail to showcase the true benefits of a foldable 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AVYypSVaahdG6ut8smhmHA" name="Galaxy Z Fold 7" alt="Galaxy Z Fold 7 review." src="https://cdn.mos.cms.futurecdn.net/AVYypSVaahdG6ut8smhmHA-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If Apple enforces its strict developer guidelines and leverages a familiar iPad-like aspect ratio, the iPhone Ultra could deliver seamless app scaling out of the gate, taking full advantage of every square millimeter.</p><p>Still, Samsung has proven that raw productivity remains its top priority. The Galaxy Z Fold 8 Ultra effortlessly runs up to four apps simultaneously, while <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">Samsung DeX</a> elevates the hardware into a true desktop-like workstation when connected to an external monitor. It sets a towering standard for mobile productivity — and I'm eager to see whether Apple can counter with a comparable multitasking solution.</p><h2 id="outlook">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LBXk5HHdP7Dq6ZSQVtvXFG" name="iPhone Ultra" alt="iPhone Ultra against colorful background." src="https://cdn.mos.cms.futurecdn.net/LBXk5HHdP7Dq6ZSQVtvXFG-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Price will ultimately be the elephant in the room for this matchup. While the Galaxy Z Fold 8 Ultra already commands a staggering $2,099 premium, early leaks and analyst projections suggest the iPhone Ultra could blow past that threshold—potentially landing anywhere between $2,000 and upwards of $2,500. That’s an eye-watering figure that's difficult to stomach for any smartphone, regardless of pedigree.</p><p>Yet, if Apple executes on its core hardware and software promises, the iPhone Ultra might just justify that astronomical investment over Samsung’s latest flagship.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-W5AKnW"></div>                            </div>                            <script src="https://kwizly.com/embed/W5AKnW.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/phones/google-pixel-phones/ive-been-testing-pixel-11-pro-xl-for-a-week-heres-why-hilight-is-the-most-disappointing-new-feature">I've been testing Pixel 11 Pro XL for a week — here's why HiLight is the most disappointing new feature</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-tried-this-magsafe-game-controller-and-it-puts-other-bluetooth-gamepads-to-shame-plus-its-usd20-off-right-now">I tried this MagSafe game controller and it puts other Bluetooth gamepads to shame — plus it’s $20 off right now</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-design-leaked-and-it-could-cause-the-most-intense-wave-of-criticism-in-galaxy-history">Samsung Galaxy S27 Ultra design leaked — and it could cause ‘the most intense wave of criticism in Galaxy history’</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy S26 FE is proof that Samsung should kill its 'Fan Edition' phones — here's why ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Earlier this week Samsung announced the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review"> Galaxy S26 FE</a>, a cut-price flagship phone that sits somewhere between the $899 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a> and the $549 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review">Galaxy A57</a>. The general idea being that you get more flagship features without necessarily having to cough up the full price of a premium device.</p><p>Unfortunately, the small amount of time I've spent with the Galaxy S26 FE suggests that Samsung has fumbled the release of the new phone. We shouldn't really be surprised, considering how lackluster the last few Fan Edition releases have been. We're at the point now where it's time for Samsung to scrap the whole line-up and let the A-series step up to the plate.</p><h2 id="too-expensive-to-be-cheap-too-compromised-to-rival-flagships">Too expensive to be cheap, too compromised to rival flagships</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CDZvxkY9W9Mkvvi7BnBpiR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE hands-on." src="https://cdn.mos.cms.futurecdn.net/CDZvxkY9W9Mkvvi7BnBpiR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>The Fan Edition series has always been about lowering the price but making cuts elsewhere. You can't have the same specs as a Galaxy S26 for a lower price, because that's just not economical. That typically manifests itself in worse cameras, cheaper materials and slightly worse performance. </p><p>In the case of the Galaxy S26 FE, those compromises come in three key areas: the screen, the camera and the performance. This is not a phone that has the latest flagship Snapdragon chips, nor does it have the latest <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-performance-face-off-snapdragon-8-elite-gen-5-vs-exynos-2600">Exynos 2600 chip that powers international variants of the S26</a>. Instead it has the Exynos 2500, which was released last year, alongside 8GB of RAM rather than the now-standard 12GB.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy S26 FE</strong></p></td><td  ><p><strong>Samsung Galaxy S26</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699</p></td><td  ><p>$899</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>6.7-inch AMOLED (FHD+)</p></td><td  ><p>6.3-inch AMOLED (FHD+)</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh Rate</strong></p></td><td  ><p>120Hz</p></td><td  ><p>120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Exynos 2500</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy (US-only) / Exynos 2600</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB</p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128 GB / 256GB / 512GB</p></td><td  ><p>256GB / 512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2), 8MP telephoto (f/2.4) with 3x optical zoom</p></td><td  ><p>50MP( f/1.8) main, 12MP (f/2.2) ultrawide, 10MP (f/2.4) telephoto w/3x optical zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Front camera</strong></p></td><td  ><p>12MP (f/2.2)</p></td><td  ><p>12MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,900 mAh</p></td><td  ><p>4,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging Speed</strong></p></td><td  ><p>45W wired, 15W wireless</p></td><td  ><p>25W wired, 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.36 x 3.03 x 0.29 inches (161.6 x 76.9 x 7.4 mm)</p></td><td  ><p>5.89 x 2.82 x 0.28 inches (149.6 x 71.7 x 7.2 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Blueberry, Graphite, Pistachio</p></td><td  ><p>Cobalt Violet, Sky Blue, Black, White (online exclusive: Silver Shadow, Pink Gold)</p></td></tr></tbody></table></div><p>Admittedly, on paper, the lower specs on the S26 FE don't seem too bad or different from that of the standard S26. It's little things that help drop the price tag, such as weaker display glass, lower resolution telephoto lenses, and the loss of premium materials like the shiny matte glass back panels. But these things all add up, and while that keeps the price down, it also makes the S26 FE a much less appealing purchase. </p><p>The starting price of $699, which gets you 128GB of storage, may make this the cheapest Galaxy S26 you can buy, but it's still not particularly cheap as far as smartphones go. Sure, it's almost half the price of something like the Galaxy S26 Ultra, but it doesn't directly fall into the cheaper phone categories like the S57 or A37.</p><p>Easily the worst part of all this is the fact that Samsung has (at the time of writing) discounted the standard Galaxy S26 by $100. This means the cheapest model, with 256GB of storage, can be <a href="https://www.samsung.com/us/smartphones/galaxy-s26/buy/galaxy-s26-256gb-unlocked-sku-sm-s942uzsexaa/" target="_blank">purchased for $799</a>. Meanwhile the 256GB variant of the Galaxy S26 FE is also $799, which means you're getting a worse phone for the same amount of money.</p><p>Sure there is a cheaper storage option that costs $100 less, but is it really worth losing out on everything the S26 has to offer to save that much? In most cases, I'd argue no.</p><h2 id="the-galaxy-a-series-keeps-getting-better">The Galaxy A series keeps getting better</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Xs5ZNd73ZWhjVe5hE6rTjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE hands-on." src="https://cdn.mos.cms.futurecdn.net/Xs5ZNd73ZWhjVe5hE6rTjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>As much as the Galaxy S26 FE isn't a huge amount worse than the Galaxy S26, it also doesn't seem to be that much better than the Galaxy A57. In fact Samsung's mid-range phone is one of the <a href="https://www.tomsguide.com/best-picks/best-cheap-phones">best cheap phones</a> you can buy because, despite the sacrifices you inevitably have to make, it's an exceptionally good phone for its price tag.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy S26 FE</strong></p></td><td  ><p><strong>Samsung Galaxy A57</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699</p></td><td  ><p>$549</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>6.7-inch AMOLED (FHD+)</p></td><td  ><p>6.7-inch, AMOLED (FHD+)</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh Rate</strong></p></td><td  ><p>120Hz</p></td><td  ><p>120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Exynos 2500</p></td><td  ><p>Exynos 1680</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB</p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128 GB / 256GB / 512GB</p></td><td  ><p>128GB / 256GB / 512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2), 8MP telephoto (f/2.4) with 3x optical zoom</p></td><td  ><p>50MP main (f/1.8), 12MP Ultrawide (f/2.2), 5MP Macro (f/2.4)</p></td></tr><tr><td class="firstcol " ><p><strong>Front camera</strong></p></td><td  ><p>12MP (f/2.2)</p></td><td  ><p>12MP</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,900 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging Speed</strong></p></td><td  ><p>45W wired, 15W wireless</p></td><td  ><p>45W wired only</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.36 x 3.03 x 0.29 inches (161.6 x 76.9 x 7.4 mm)</p></td><td  ><p>6.35 x 3.02 x 0.27 inches (161.5 x 76.8 x 6.9mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Blueberry, Graphite, Pistachio</p></td><td  ><p>Navy, Gray, Icyblue, Lilac</p></td></tr></tbody></table></div><p>It's a lot easier to see where the Galaxy A57 made the cuts in contrast to the S26 FE. The main sticking point for me is the <a href="https://www.tomsguide.com/phones/samsung-phones/i-put-samsung-galaxy-a57s-macro-lens-head-to-head-with-galaxy-s26-ultras-macro-mode-and-its-not-even-close">terrible macro camera</a>, which always feels like an absolute waste of hardware compared to a dedicated macro camera mode other smartphones utilize. It also looks a lot cheaper, and the performance hardware is more noticeably inferior.</p><p>It doesn't matter if you don't know anything about phone chips, the fact that the A57 has an Exynos 1680 means it might as well have a giant neon sign declaring that it won't outperform the S26 FE's Exynos 2500.</p><p>That being said, we've been seeing pretty big gains in the mid-range phone market over the past several years. They're starting to feel a lot more premium, and they're coming with AI and software features that you previously wouldn't see outside ultra-premium models. The yearly upgrades aren't exactly stellar, but that seems to be a problem all phones are facing right now — no matter the price point.</p><p>A Galaxy A-series phone is never going to be as good as a flagship S-series, but it still offers a lot of the things you might need from a phone, including solid cameras, battery life and so on. There's even some solid AI features thrown in, if you're the kind of person who really likes using Galaxy AI and Bixby. </p><p>Admittedly, the Fan Edition phones have all done this too, but they also cost more and don't offer as much of a discount compared to other Galaxy S-series phones. </p><h2 id="bottom-line-galaxy-fe-phones-lack-purpose">Bottom line: Galaxy FE phones lack purpose</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7PPxxLNxP4CVPu4cMAN8iR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE hands-on." src="https://cdn.mos.cms.futurecdn.net/7PPxxLNxP4CVPu4cMAN8iR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>Few phone companies take the approach Samsung does when it comes to cheaper-than-flagship phones. In fact, Samsung is the only one I can think of that offers two distinct devices that are meant to sit below the entry level premium model. The likes of Google, Apple, Nothing and others typically only have the one. </p><p>With two devices that sit in such close proximity, from both a price and hardware perspective, differentiating them becomes a much harder task. We end up in a situation where the Galaxy S26 FE feels awkwardly placed in a bizarre, paradoxical middle ground.</p><p>In the past Samsung was a lot more inconsistent about releasing the A50-series phones in the U.S., which arguably gave the Fan Edition release a lot more breathing room. There's clearly demand for a cheaper Galaxy phone, and the lack of competition from itself meant Samsung could continue to push the more premium option. </p><p>These days, it feels like these phones are released out of obligation, rather than a pressing need to actually build them. And it's about time Samsung threw in the towel, and gave the Fan Edition line-up a trip to the farm upstate.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-design-leaked-and-it-could-cause-the-most-intense-wave-of-criticism-in-galaxy-history">Samsung Galaxy S27 Ultra design leaked — and it could cause ‘the most intense wave of criticism in Galaxy history’</a></li><li><a href="https://www.tomsguide.com/phones/iphones/expert-predicts-iphone-ultras-usd2-500-price-tag-wont-deter-die-hard-fans-it-could-see-10-million-units-sold-in-the-next-year">Expert predicts iPhone Ultra's $2,500 price tag won't deter die-hard fans — it could see 10 million units sold in the next year</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/ive-been-testing-pixel-11-pro-xl-for-a-week-heres-why-hilight-is-the-most-disappointing-new-feature">I've been testing Pixel 11 Pro XL for a week — here's why HiLight is the most disappointing new feature</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-is-proof-that-samsung-should-kill-its-fan-edition-phones-heres-why</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy S26 FE is proof that the Fan Edition series has outlived its usefulness, and it's time Samsung killed it in favor of the Galaxy A-series instead. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Cg3zWaETQQPq52kAQUQxXF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JNzS5dtCK9PWLodyx8zXjR-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 30 Aug 2026 11:00:00 +0000</pubDate>                                                                                                                                <updated>Sun, 30 Aug 2026 22:19:55 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JNzS5dtCK9PWLodyx8zXjR-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide / Tom Pritchard]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy S26 FE hands-on.]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy S26 FE hands-on.]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy S26 FE hands-on.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JNzS5dtCK9PWLodyx8zXjR-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Earlier this week Samsung announced the<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review"> Galaxy S26 FE</a>, a cut-price flagship phone that sits somewhere between the $899 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a> and the $549 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review">Galaxy A57</a>. The general idea being that you get more flagship features without necessarily having to cough up the full price of a premium device.</p><p>Unfortunately, the small amount of time I've spent with the Galaxy S26 FE suggests that Samsung has fumbled the release of the new phone. We shouldn't really be surprised, considering how lackluster the last few Fan Edition releases have been. We're at the point now where it's time for Samsung to scrap the whole line-up and let the A-series step up to the plate.</p><h2 id="too-expensive-to-be-cheap-too-compromised-to-rival-flagships">Too expensive to be cheap, too compromised to rival flagships</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CDZvxkY9W9Mkvvi7BnBpiR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE hands-on." src="https://cdn.mos.cms.futurecdn.net/CDZvxkY9W9Mkvvi7BnBpiR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>The Fan Edition series has always been about lowering the price but making cuts elsewhere. You can't have the same specs as a Galaxy S26 for a lower price, because that's just not economical. That typically manifests itself in worse cameras, cheaper materials and slightly worse performance. </p><p>In the case of the Galaxy S26 FE, those compromises come in three key areas: the screen, the camera and the performance. This is not a phone that has the latest flagship Snapdragon chips, nor does it have the latest <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-performance-face-off-snapdragon-8-elite-gen-5-vs-exynos-2600">Exynos 2600 chip that powers international variants of the S26</a>. Instead it has the Exynos 2500, which was released last year, alongside 8GB of RAM rather than the now-standard 12GB.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy S26 FE</strong></p></td><td  ><p><strong>Samsung Galaxy S26</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699</p></td><td  ><p>$899</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>6.7-inch AMOLED (FHD+)</p></td><td  ><p>6.3-inch AMOLED (FHD+)</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh Rate</strong></p></td><td  ><p>120Hz</p></td><td  ><p>120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Exynos 2500</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy (US-only) / Exynos 2600</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB</p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128 GB / 256GB / 512GB</p></td><td  ><p>256GB / 512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2), 8MP telephoto (f/2.4) with 3x optical zoom</p></td><td  ><p>50MP( f/1.8) main, 12MP (f/2.2) ultrawide, 10MP (f/2.4) telephoto w/3x optical zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Front camera</strong></p></td><td  ><p>12MP (f/2.2)</p></td><td  ><p>12MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,900 mAh</p></td><td  ><p>4,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging Speed</strong></p></td><td  ><p>45W wired, 15W wireless</p></td><td  ><p>25W wired, 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.36 x 3.03 x 0.29 inches (161.6 x 76.9 x 7.4 mm)</p></td><td  ><p>5.89 x 2.82 x 0.28 inches (149.6 x 71.7 x 7.2 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Blueberry, Graphite, Pistachio</p></td><td  ><p>Cobalt Violet, Sky Blue, Black, White (online exclusive: Silver Shadow, Pink Gold)</p></td></tr></tbody></table></div><p>Admittedly, on paper, the lower specs on the S26 FE don't seem too bad or different from that of the standard S26. It's little things that help drop the price tag, such as weaker display glass, lower resolution telephoto lenses, and the loss of premium materials like the shiny matte glass back panels. But these things all add up, and while that keeps the price down, it also makes the S26 FE a much less appealing purchase. </p><p>The starting price of $699, which gets you 128GB of storage, may make this the cheapest Galaxy S26 you can buy, but it's still not particularly cheap as far as smartphones go. Sure, it's almost half the price of something like the Galaxy S26 Ultra, but it doesn't directly fall into the cheaper phone categories like the S57 or A37.</p><p>Easily the worst part of all this is the fact that Samsung has (at the time of writing) discounted the standard Galaxy S26 by $100. This means the cheapest model, with 256GB of storage, can be <a href="https://www.samsung.com/us/smartphones/galaxy-s26/buy/galaxy-s26-256gb-unlocked-sku-sm-s942uzsexaa/" target="_blank">purchased for $799</a>. Meanwhile the 256GB variant of the Galaxy S26 FE is also $799, which means you're getting a worse phone for the same amount of money.</p><p>Sure there is a cheaper storage option that costs $100 less, but is it really worth losing out on everything the S26 has to offer to save that much? In most cases, I'd argue no.</p><h2 id="the-galaxy-a-series-keeps-getting-better">The Galaxy A series keeps getting better</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Xs5ZNd73ZWhjVe5hE6rTjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE hands-on." src="https://cdn.mos.cms.futurecdn.net/Xs5ZNd73ZWhjVe5hE6rTjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>As much as the Galaxy S26 FE isn't a huge amount worse than the Galaxy S26, it also doesn't seem to be that much better than the Galaxy A57. In fact Samsung's mid-range phone is one of the <a href="https://www.tomsguide.com/best-picks/best-cheap-phones">best cheap phones</a> you can buy because, despite the sacrifices you inevitably have to make, it's an exceptionally good phone for its price tag.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galaxy S26 FE</strong></p></td><td  ><p><strong>Samsung Galaxy A57</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699</p></td><td  ><p>$549</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>6.7-inch AMOLED (FHD+)</p></td><td  ><p>6.7-inch, AMOLED (FHD+)</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh Rate</strong></p></td><td  ><p>120Hz</p></td><td  ><p>120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Exynos 2500</p></td><td  ><p>Exynos 1680</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB</p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128 GB / 256GB / 512GB</p></td><td  ><p>128GB / 256GB / 512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2), 8MP telephoto (f/2.4) with 3x optical zoom</p></td><td  ><p>50MP main (f/1.8), 12MP Ultrawide (f/2.2), 5MP Macro (f/2.4)</p></td></tr><tr><td class="firstcol " ><p><strong>Front camera</strong></p></td><td  ><p>12MP (f/2.2)</p></td><td  ><p>12MP</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,900 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging Speed</strong></p></td><td  ><p>45W wired, 15W wireless</p></td><td  ><p>45W wired only</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.36 x 3.03 x 0.29 inches (161.6 x 76.9 x 7.4 mm)</p></td><td  ><p>6.35 x 3.02 x 0.27 inches (161.5 x 76.8 x 6.9mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Blueberry, Graphite, Pistachio</p></td><td  ><p>Navy, Gray, Icyblue, Lilac</p></td></tr></tbody></table></div><p>It's a lot easier to see where the Galaxy A57 made the cuts in contrast to the S26 FE. The main sticking point for me is the <a href="https://www.tomsguide.com/phones/samsung-phones/i-put-samsung-galaxy-a57s-macro-lens-head-to-head-with-galaxy-s26-ultras-macro-mode-and-its-not-even-close">terrible macro camera</a>, which always feels like an absolute waste of hardware compared to a dedicated macro camera mode other smartphones utilize. It also looks a lot cheaper, and the performance hardware is more noticeably inferior.</p><p>It doesn't matter if you don't know anything about phone chips, the fact that the A57 has an Exynos 1680 means it might as well have a giant neon sign declaring that it won't outperform the S26 FE's Exynos 2500.</p><p>That being said, we've been seeing pretty big gains in the mid-range phone market over the past several years. They're starting to feel a lot more premium, and they're coming with AI and software features that you previously wouldn't see outside ultra-premium models. The yearly upgrades aren't exactly stellar, but that seems to be a problem all phones are facing right now — no matter the price point.</p><p>A Galaxy A-series phone is never going to be as good as a flagship S-series, but it still offers a lot of the things you might need from a phone, including solid cameras, battery life and so on. There's even some solid AI features thrown in, if you're the kind of person who really likes using Galaxy AI and Bixby. </p><p>Admittedly, the Fan Edition phones have all done this too, but they also cost more and don't offer as much of a discount compared to other Galaxy S-series phones. </p><h2 id="bottom-line-galaxy-fe-phones-lack-purpose">Bottom line: Galaxy FE phones lack purpose</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="7PPxxLNxP4CVPu4cMAN8iR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE hands-on." src="https://cdn.mos.cms.futurecdn.net/7PPxxLNxP4CVPu4cMAN8iR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>Few phone companies take the approach Samsung does when it comes to cheaper-than-flagship phones. In fact, Samsung is the only one I can think of that offers two distinct devices that are meant to sit below the entry level premium model. The likes of Google, Apple, Nothing and others typically only have the one. </p><p>With two devices that sit in such close proximity, from both a price and hardware perspective, differentiating them becomes a much harder task. We end up in a situation where the Galaxy S26 FE feels awkwardly placed in a bizarre, paradoxical middle ground.</p><p>In the past Samsung was a lot more inconsistent about releasing the A50-series phones in the U.S., which arguably gave the Fan Edition release a lot more breathing room. There's clearly demand for a cheaper Galaxy phone, and the lack of competition from itself meant Samsung could continue to push the more premium option. </p><p>These days, it feels like these phones are released out of obligation, rather than a pressing need to actually build them. And it's about time Samsung threw in the towel, and gave the Fan Edition line-up a trip to the farm upstate.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-design-leaked-and-it-could-cause-the-most-intense-wave-of-criticism-in-galaxy-history">Samsung Galaxy S27 Ultra design leaked — and it could cause ‘the most intense wave of criticism in Galaxy history’</a></li><li><a href="https://www.tomsguide.com/phones/iphones/expert-predicts-iphone-ultras-usd2-500-price-tag-wont-deter-die-hard-fans-it-could-see-10-million-units-sold-in-the-next-year">Expert predicts iPhone Ultra's $2,500 price tag won't deter die-hard fans — it could see 10 million units sold in the next year</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/ive-been-testing-pixel-11-pro-xl-for-a-week-heres-why-hilight-is-the-most-disappointing-new-feature">I've been testing Pixel 11 Pro XL for a week — here's why HiLight is the most disappointing new feature</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy S26 FE hands-on review: I'm not sure if this phone needed to exist ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If you're looking for a premium Galaxy smartphone experience, but can't quite justify the cost of a standard <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a>, then Samsung is hoping that the Galaxy S26 FE might be for you. This is the latest in the long line of "Fan Edition" phones and the idea is that Samsung cuts a few features, but in the process offers a near-flagship experience for a lower price.</p><p>The Samsung Galaxy S26 FE certainly does that, though it may take things a little bit too far. I spent a little bit of time with the S26 FE ahead of today's announcement, and started to wonder who this phone is really for. After all, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review">Samsung Galaxy A57</a> already captures the lower-priced mid-range segment and recent discounts to the standard Galaxy S26 make it more accessible than before. </p><p>The Galaxy S26 FE seems to occupy the same awkward middle ground as its predecessors. The specs aren't good enough to qualify it as a true flagship, but at the same time, it isn't cheap enough to be a true budget option.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-hands-on-review-specifications"><span>Samsung Galaxy S26 FE hands-on review: Specifications</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Galaxy S26 FE</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699</p></td></tr><tr><td class="firstcol " ><p><strong>Release date</strong></p></td><td  ><p>September 4</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>6.7-inch AMOLED (FHD+)</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Exynos 2500</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB,  256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2), 8MP telephoto (f/2.4) with 3x optical zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Front camera</strong></p></td><td  ><p>12MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery size</strong></p></td><td  ><p>4,900 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging speed</strong></p></td><td  ><p>45W wired, 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.36 x 3.03 x 0.29 inches (161.6 x 76.9 x 7.4 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>6.81 ounces (193 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Blueberry, Graphite, Pistachio</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-hands-on-review-the-ups"><span>Samsung Galaxy S26 FE hands-on review: The Ups</span></h2><h2 id="the-cost-of-entry-isn-39-t-too-high">The cost of entry isn't too high</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JNzS5dtCK9PWLodyx8zXjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE in Pistachio held in the hand." src="https://cdn.mos.cms.futurecdn.net/JNzS5dtCK9PWLodyx8zXjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>In a world of price hikes and RAMageddon, it's no surprise that the Galaxy S26 FE is more expensive than the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-fe-review">S25 FE</a>. That said, a $50 price hike isn't actually a lot, and that helps keep the cost of buying into the Galaxy S26 lineup much lower than it was before. The fact that Samsung has kept the 128GB model around means the $699 starting price is $200 less than the standard Galaxy S26 was at launch. </p><p>Admittedly that benefit only really matters if you plan on buying the 128GB model, and can't justify spending an extra $100 more. Why? Because, at the time of writing, Samsung's online store is selling the 256GB Galaxy S26 <a href="https://www.samsung.com/us/smartphones/galaxy-s26/buy/galaxy-s26-256gb-unlocked-sku-sm-s942uzsexaa/" target="_blank" rel="nofollow">for $799</a> — the exact same price as the 256GB S26 FE.</p><p>In other words spending an extra $100 can get you a phone with better hardware. However, if you want to keep costs low and want access to the flagship capabilities of a Galaxy S26, then the FE is an option for you.</p><h2 id="more-premium-than-most-cheap-phones">More premium than most cheap phones</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JAFmcNMfu2JRAJVoJ6yYjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE frame closeup." src="https://cdn.mos.cms.futurecdn.net/JAFmcNMfu2JRAJVoJ6yYjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>The main benefit for the S26 FE, compared to the likes of the A57, is that you do get a slightly more premium build and feature set. All without having to pay quite as much as you would if you picked up a Galaxy S26 or one of its larger siblings.</p><p>The glossy glass back isn't quite as impressive as the matte glass on the back of the Galaxy S26. Honestly, seeing my own silhouette reflected in the back of the phone instantly made me think of the Galaxy A57, which is a shame when you remember that past FE devices had the matte glass to offer that instantly-premium look.</p><p>Still, the Galaxy S26 FE doesn't really feel cheap. It's reminiscent of the Galaxy S26 Plus due to its size, and there's definitely some weight to it that makes it feel more important than an A-series Galaxy. The brushed metal frame certainly helps in this respect, as does the solid-coloring of the camera bar — a design trait borrowed from other S26 phones.</p><h2 id="great-selection-of-ai-and-software-features">Great selection of AI and software 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gasM6H8jtNvrZbe8yHJfkR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE display with Now Brief." src="https://cdn.mos.cms.futurecdn.net/gasM6H8jtNvrZbe8yHJfkR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>Like any device hoping to be considered close to flagship, the Galaxy S26 FE does come with a huge range of AI features. There's nothing new here, which isn't a huge surprise, but it does come with the best things Galaxy AI has had to offer on other phones — including my favorite <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> feature, <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-the-new-galaxy-ai-video-tracker-on-my-z-fold-8">My Fan Cam</a>.</p><p>In fact, there are a bunch of cool software features that we've seen on other Galaxy flagships, but still haven't had the option to use on cheaper devices. That includes the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-just-did-the-impossible-with-the-galaxy-s26-ultra-i-cant-decide-which-of-these-two-new-features-i-like-more">Horizontal Lock</a> video camera mode, the <a href="https://www.tomsguide.com/phones/samsung-phones/i-tested-this-galaxy-s26-ai-feature-to-scan-my-tax-documents-and-it-makes-my-scanner-obsolete">Samsung Document Scanner</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-the-samsung-galaxy-s25-ultras-audio-eraser-and-it-beats-both-apple-and-google">Audio Eraser</a>, AI-powered photo editing with <a href="https://www.tomsguide.com/phones/i-tested-galaxy-s26-ultra-photo-assist-vs-pixel-10-pro-xl-ask-photos-heres-the-better-ai-photo-editor">Photo Assist</a>, Now Brief, <a href="https://www.tomsguide.com/opinion/circle-to-search-is-my-favorite-galaxy-s24-feature-if-samsung-and-google-dont-screw-it-up">Circle to Search</a> with multi-object recognition, as well as <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works">Now Nudge</a> with support for cross-app functionality and third party apps.</p><p>Samsung also promises that the upgraded ProVisual engine is also here. This offers improved low light performance, reducing noise in the photo and lowering the overall color distortion. Though we haven't been able to test this for ourselves just yet.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-hands-on-review-the-downs"><span>Samsung Galaxy S26 FE hands-on review: The Downs</span></h2><h2 id="camera-quality-seems-iffy-so-far">Camera quality seems iffy so far</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eQqeSygcj5dPkjB3KDzKiR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE camera closeup." src="https://cdn.mos.cms.futurecdn.net/eQqeSygcj5dPkjB3KDzKiR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>I will caveat this point by making it clear I haven't done any extensive camera testing with the Galaxy S26 FE, but the few sample photos I have taken so far were not very impressive. In fact, the four cameras on the S26 FE seem to struggle when compared to those on the Galaxy A57.</p><p>From a hardware perspective, things are a little disappointing. There's a 50MP main camera, a 12MP ultrawide, 8MP telephoto with 3x optical zoom and a 12MP selfie camera. That's pretty similar to the A57, albeit with a telephoto lens instead of a <a href="https://www.tomsguide.com/phones/samsung-phones/i-put-samsung-galaxy-a57s-macro-lens-head-to-head-with-galaxy-s26-ultras-macro-mode-and-its-not-even-close">crappy 5MP macro lens.</a></p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vpxLMoA6KvPx2arcyY7zrX-1920-80.jpg" alt="samsung galaxy s26 fe test shots" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/WCnKigwTNm2n5DK97Q8Dym-1920-80.jpg" alt="samsung galaxy a57 test shots" /><figcaption>Samsung Galaxy A57<small role="credit">Future</small></figcaption></figure></figure><p>That minor change in third-camera hardware means that there's a big difference in the zoomed in photo I took. Since the A57 relies on its main lens, it's using a higher resolution lens and cropping it down — rather than actually zooming in. The camera defaults to 12MP, and while not great it is obviously higher than what an 8MP lens can accomplish.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vo3z8qCfWTP6LdvinBD2gY-1920-80.jpg" alt="samsung galaxy s26 fe test shots" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/D7foBdLzVLax4C6yivpyFn-1920-80.jpg" alt="samsung galaxy a57 test shots" /><figcaption>Samsung Galaxy A57<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Ex3bk6BoGMi6k7qt6vaueY-1920-80.jpg" alt="samsung galaxy s26 fe test shots" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/L4T6jf2a8ceWhiHqjYFQTn-1920-80.jpg" alt="samsung galaxy a57 test shots" /><figcaption>Samsung Galaxy A57<small role="credit">Future</small></figcaption></figure></figure><p>The main lens on the S26 FE is a little better, with some extra clarity that lets you make out the sugar crystals a little more easily, though it does come out much darker and less vibrant. The same is true when looking at this photo of a plant, with both 50MP lenses offering similar quality — but wildly different brightness levels.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/DBbDV2CUPdED5A3npLmSxW-1920-80.jpg" alt="samsung galaxy s26 fe test shots" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/EQJNgPqLNRsoN6f9Etr9sm-1920-80.jpg" alt="samsung galaxy a57 test shots" /><figcaption>Samsung Galaxy A57<small role="credit">Future</small></figcaption></figure></figure><p>The selfie camera is a step in the opposite direction, though. While the A57 washed out the color from my face compared to the S26 FE, there's a lot more detail and clarity compared on the cheaper phone. The S26 FE is slightly blurrier, and struggles to pick up the finer details including hair and skin complexion.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/5KtDFkpf7MWbAHMvVLoRzF-1920-80.jpg" alt="Samsung galaxy S26 test shots" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/foFYQHsH923d3RCTo2G2VE-1920-80.jpg" alt="Samsung galaxy S26 test shots" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/oRXyFzX2LkA2x94Vk4rhXF-1920-80.jpg" alt="Samsung galaxy S26 test shots" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hdqVYMLAdB4QE9UAn5EHGF-1920-80.jpg" alt="Samsung galaxy S26 test shots" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure></figure><p>As you'd expect the regular Galaxy S26 outmatches them all, with more true-to-life colors and general clarity exceeding both the A57 and S26 FE. Even if my attempt at a selfie did not come out particularly well during my hands-on time. Still, the fact that the Galaxy A57 manages to offer some serious competition to the S26 FE, despite it being $150 cheaper, is not a good look for the Fan Edition phone.</p><h2 id="upgrades-are-minimal">Upgrades are minimal</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Xs5ZNd73ZWhjVe5hE6rTjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE against A57 and Galaxy S26." src="https://cdn.mos.cms.futurecdn.net/Xs5ZNd73ZWhjVe5hE6rTjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>Incremental upgrades with few major hardware upgrades are not uncommon, and the Galaxy S26 FE seems to be the latest example of that to come from Samsung HQ. Checking over the specs compared to last year's Galaxy S25 FE really highlights how few upgrades there are this year. If you didn't know any better, you could easily mistake the S26 FE for an older model, and only real changes are the newer Exynos chipset and the glass enclosure around the rear camera lenses. </p><p>Everything else, from the cameras to the battery are essentially identical, which means Samsung is relying more on software upgrades to help sell the phone over its predecessors. Which is not a terrible plan, considering the number of flagship features Samsung has added to the Galaxy S26 FE. But it doesn't suggest that the phone is a must-have. Especially when you remember the Galaxy A57 exists.</p><h2 id="the-galaxy-a57-is-right-there">The Galaxy A57 is right there</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WnVbdoxHAWjSTTJWxanJnR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE and A57 held in the hand." src="https://cdn.mos.cms.futurecdn.net/WnVbdoxHAWjSTTJWxanJnR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>The minimal upgrades wouldn't be so bad on their own, but we can't forget the fact that the Galaxy A57 is still around — and costs a good $150 less than the cheapest Galaxy S26 FE. There are a bunch of ways the Galaxy A57 falters compared to the S26 FE, particularly when it comes to performance and the availability of AI features. That price cut has to come from somewhere, and Samsung can't save all that money by cutting premium materials.</p><p>Still, at the same time, the A57 shares a lot of the same hardware with the Galaxy S26 FE. The camera hardware is more or less identical, and puts up a good fight against the S26 FE's cameras, and both screens share the same size, resolution and brightness. The A57's battery is actually larger, weirdly enough, and they both support up to 45W wired charging speeds — though the A57 lacks wireless charging.</p><p>We can't do a full comparison just yet, and we'll need to get the S26 FE into the lab to figure out exactly what its deal is. Because there's only so much you can glean from a list of hardware specs. Still, things don't look great. Especially considering the $50 price hike, and the fact that the 256GB Galaxy S26 costs the same as the equivalent FE.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-hands-on-review-outlook"><span>Samsung Galaxy S26 FE hands-on review: Outlook</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GYNd6cPd7ZVnmCg7qSqYjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE in three colors." src="https://cdn.mos.cms.futurecdn.net/GYNd6cPd7ZVnmCg7qSqYjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>The Galaxy S26 FE certainly shows promise, I'm struggling to understand why Samsung is releasing it in the first place. The Fan Edition series has been losing relevance for a while, especially now that Samsung is consistently releasing A-series phones in the U.S. and the Galaxy S26 FE doesn't really do much to help salvage the line-up's reputation in any way.</p><p>Based on my limited time with the phone, it seems that it is too similar to the Galaxy A57 to justify the higher price tag. At the same time, the price is too close to that of the Galaxy S26 to make many of these compromises worthwhile. It's that weird middle ground where it's not a cheap phone, but it's too cut back to be a true flagship.</p><p>So who is this phone for? It does offer more AI and Samsung-exclusive software features than cheaper options, and the fact that the 128GB storage option is still around means the cost of entry is noticeably lower. If you're an AI superfan that doesn't have a lot of money, this might be the Samsung phone for you, but otherwise you may as well pick up a different model.</p><p>Of course we'll have a much better idea of what the Galaxy S26 FE can do when we get the phone into the Tom's Guide lab for testing. That could change everything, or it could cement the idea that the S26 FE needs to die. We'll just have to wait and see.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-fe-review</link>
                                                                            <description>
                            <![CDATA[ Samsung Galaxy S26 FE is an awkwardly positioned phone that makes too many sacrifices to be truly premium, but costs to much to be considered cheap. Which means it's being overshadowed by existing Galaxy handsets. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JB2BcFVj7QfNgz6Lrti4T8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/dFsGjVtBpe4fQFPt3dtmKR-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 27 Aug 2026 12:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 27 Aug 2026 22:47:34 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/dFsGjVtBpe4fQFPt3dtmKR-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&amp;#39;s Guide / Tom Pritchard]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy S26 FE hands-on.]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy S26 FE hands-on.]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy S26 FE hands-on.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/dFsGjVtBpe4fQFPt3dtmKR-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If you're looking for a premium Galaxy smartphone experience, but can't quite justify the cost of a standard <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a>, then Samsung is hoping that the Galaxy S26 FE might be for you. This is the latest in the long line of "Fan Edition" phones and the idea is that Samsung cuts a few features, but in the process offers a near-flagship experience for a lower price.</p><p>The Samsung Galaxy S26 FE certainly does that, though it may take things a little bit too far. I spent a little bit of time with the S26 FE ahead of today's announcement, and started to wonder who this phone is really for. After all, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-a57-review">Samsung Galaxy A57</a> already captures the lower-priced mid-range segment and recent discounts to the standard Galaxy S26 make it more accessible than before. </p><p>The Galaxy S26 FE seems to occupy the same awkward middle ground as its predecessors. The specs aren't good enough to qualify it as a true flagship, but at the same time, it isn't cheap enough to be a true budget option.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-hands-on-review-specifications"><span>Samsung Galaxy S26 FE hands-on review: Specifications</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Galaxy S26 FE</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>$699</p></td></tr><tr><td class="firstcol " ><p><strong>Release date</strong></p></td><td  ><p>September 4</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>6.7-inch AMOLED (FHD+)</p></td></tr><tr><td class="firstcol " ><p><strong>Refresh rate</strong></p></td><td  ><p>120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Exynos 2500</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>8GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>128GB,  256GB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2), 8MP telephoto (f/2.4) with 3x optical zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Front camera</strong></p></td><td  ><p>12MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery size</strong></p></td><td  ><p>4,900 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging speed</strong></p></td><td  ><p>45W wired, 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.36 x 3.03 x 0.29 inches (161.6 x 76.9 x 7.4 mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>6.81 ounces (193 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Blueberry, Graphite, Pistachio</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-hands-on-review-the-ups"><span>Samsung Galaxy S26 FE hands-on review: The Ups</span></h2><h2 id="the-cost-of-entry-isn-39-t-too-high">The cost of entry isn't too high</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JNzS5dtCK9PWLodyx8zXjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE in Pistachio held in the hand." src="https://cdn.mos.cms.futurecdn.net/JNzS5dtCK9PWLodyx8zXjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>In a world of price hikes and RAMageddon, it's no surprise that the Galaxy S26 FE is more expensive than the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s25-fe-review">S25 FE</a>. That said, a $50 price hike isn't actually a lot, and that helps keep the cost of buying into the Galaxy S26 lineup much lower than it was before. The fact that Samsung has kept the 128GB model around means the $699 starting price is $200 less than the standard Galaxy S26 was at launch. </p><p>Admittedly that benefit only really matters if you plan on buying the 128GB model, and can't justify spending an extra $100 more. Why? Because, at the time of writing, Samsung's online store is selling the 256GB Galaxy S26 <a href="https://www.samsung.com/us/smartphones/galaxy-s26/buy/galaxy-s26-256gb-unlocked-sku-sm-s942uzsexaa/" target="_blank" rel="nofollow">for $799</a> — the exact same price as the 256GB S26 FE.</p><p>In other words spending an extra $100 can get you a phone with better hardware. However, if you want to keep costs low and want access to the flagship capabilities of a Galaxy S26, then the FE is an option for you.</p><h2 id="more-premium-than-most-cheap-phones">More premium than most cheap phones</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="JAFmcNMfu2JRAJVoJ6yYjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE frame closeup." src="https://cdn.mos.cms.futurecdn.net/JAFmcNMfu2JRAJVoJ6yYjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>The main benefit for the S26 FE, compared to the likes of the A57, is that you do get a slightly more premium build and feature set. All without having to pay quite as much as you would if you picked up a Galaxy S26 or one of its larger siblings.</p><p>The glossy glass back isn't quite as impressive as the matte glass on the back of the Galaxy S26. Honestly, seeing my own silhouette reflected in the back of the phone instantly made me think of the Galaxy A57, which is a shame when you remember that past FE devices had the matte glass to offer that instantly-premium look.</p><p>Still, the Galaxy S26 FE doesn't really feel cheap. It's reminiscent of the Galaxy S26 Plus due to its size, and there's definitely some weight to it that makes it feel more important than an A-series Galaxy. The brushed metal frame certainly helps in this respect, as does the solid-coloring of the camera bar — a design trait borrowed from other S26 phones.</p><h2 id="great-selection-of-ai-and-software-features">Great selection of AI and software 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gasM6H8jtNvrZbe8yHJfkR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE display with Now Brief." src="https://cdn.mos.cms.futurecdn.net/gasM6H8jtNvrZbe8yHJfkR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>Like any device hoping to be considered close to flagship, the Galaxy S26 FE does come with a huge range of AI features. There's nothing new here, which isn't a huge surprise, but it does come with the best things Galaxy AI has had to offer on other phones — including my favorite <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> feature, <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-the-new-galaxy-ai-video-tracker-on-my-z-fold-8">My Fan Cam</a>.</p><p>In fact, there are a bunch of cool software features that we've seen on other Galaxy flagships, but still haven't had the option to use on cheaper devices. That includes the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-just-did-the-impossible-with-the-galaxy-s26-ultra-i-cant-decide-which-of-these-two-new-features-i-like-more">Horizontal Lock</a> video camera mode, the <a href="https://www.tomsguide.com/phones/samsung-phones/i-tested-this-galaxy-s26-ai-feature-to-scan-my-tax-documents-and-it-makes-my-scanner-obsolete">Samsung Document Scanner</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-the-samsung-galaxy-s25-ultras-audio-eraser-and-it-beats-both-apple-and-google">Audio Eraser</a>, AI-powered photo editing with <a href="https://www.tomsguide.com/phones/i-tested-galaxy-s26-ultra-photo-assist-vs-pixel-10-pro-xl-ask-photos-heres-the-better-ai-photo-editor">Photo Assist</a>, Now Brief, <a href="https://www.tomsguide.com/opinion/circle-to-search-is-my-favorite-galaxy-s24-feature-if-samsung-and-google-dont-screw-it-up">Circle to Search</a> with multi-object recognition, as well as <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works">Now Nudge</a> with support for cross-app functionality and third party apps.</p><p>Samsung also promises that the upgraded ProVisual engine is also here. This offers improved low light performance, reducing noise in the photo and lowering the overall color distortion. Though we haven't been able to test this for ourselves just yet.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-hands-on-review-the-downs"><span>Samsung Galaxy S26 FE hands-on review: The Downs</span></h2><h2 id="camera-quality-seems-iffy-so-far">Camera quality seems iffy so far</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="eQqeSygcj5dPkjB3KDzKiR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE camera closeup." src="https://cdn.mos.cms.futurecdn.net/eQqeSygcj5dPkjB3KDzKiR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>I will caveat this point by making it clear I haven't done any extensive camera testing with the Galaxy S26 FE, but the few sample photos I have taken so far were not very impressive. In fact, the four cameras on the S26 FE seem to struggle when compared to those on the Galaxy A57.</p><p>From a hardware perspective, things are a little disappointing. There's a 50MP main camera, a 12MP ultrawide, 8MP telephoto with 3x optical zoom and a 12MP selfie camera. That's pretty similar to the A57, albeit with a telephoto lens instead of a <a href="https://www.tomsguide.com/phones/samsung-phones/i-put-samsung-galaxy-a57s-macro-lens-head-to-head-with-galaxy-s26-ultras-macro-mode-and-its-not-even-close">crappy 5MP macro lens.</a></p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vpxLMoA6KvPx2arcyY7zrX-1920-80.jpg" alt="samsung galaxy s26 fe test shots" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/WCnKigwTNm2n5DK97Q8Dym-1920-80.jpg" alt="samsung galaxy a57 test shots" /><figcaption>Samsung Galaxy A57<small role="credit">Future</small></figcaption></figure></figure><p>That minor change in third-camera hardware means that there's a big difference in the zoomed in photo I took. Since the A57 relies on its main lens, it's using a higher resolution lens and cropping it down — rather than actually zooming in. The camera defaults to 12MP, and while not great it is obviously higher than what an 8MP lens can accomplish.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/vo3z8qCfWTP6LdvinBD2gY-1920-80.jpg" alt="samsung galaxy s26 fe test shots" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/D7foBdLzVLax4C6yivpyFn-1920-80.jpg" alt="samsung galaxy a57 test shots" /><figcaption>Samsung Galaxy A57<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Ex3bk6BoGMi6k7qt6vaueY-1920-80.jpg" alt="samsung galaxy s26 fe test shots" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/L4T6jf2a8ceWhiHqjYFQTn-1920-80.jpg" alt="samsung galaxy a57 test shots" /><figcaption>Samsung Galaxy A57<small role="credit">Future</small></figcaption></figure></figure><p>The main lens on the S26 FE is a little better, with some extra clarity that lets you make out the sugar crystals a little more easily, though it does come out much darker and less vibrant. The same is true when looking at this photo of a plant, with both 50MP lenses offering similar quality — but wildly different brightness levels.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/DBbDV2CUPdED5A3npLmSxW-1920-80.jpg" alt="samsung galaxy s26 fe test shots" /><figcaption>Samsung Galaxy S26 FE<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/EQJNgPqLNRsoN6f9Etr9sm-1920-80.jpg" alt="samsung galaxy a57 test shots" /><figcaption>Samsung Galaxy A57<small role="credit">Future</small></figcaption></figure></figure><p>The selfie camera is a step in the opposite direction, though. While the A57 washed out the color from my face compared to the S26 FE, there's a lot more detail and clarity compared on the cheaper phone. The S26 FE is slightly blurrier, and struggles to pick up the finer details including hair and skin complexion.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/5KtDFkpf7MWbAHMvVLoRzF-1920-80.jpg" alt="Samsung galaxy S26 test shots" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/foFYQHsH923d3RCTo2G2VE-1920-80.jpg" alt="Samsung galaxy S26 test shots" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/oRXyFzX2LkA2x94Vk4rhXF-1920-80.jpg" alt="Samsung galaxy S26 test shots" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hdqVYMLAdB4QE9UAn5EHGF-1920-80.jpg" alt="Samsung galaxy S26 test shots" /><figcaption>Samsung Galaxy S26<small role="credit">Future</small></figcaption></figure></figure><p>As you'd expect the regular Galaxy S26 outmatches them all, with more true-to-life colors and general clarity exceeding both the A57 and S26 FE. Even if my attempt at a selfie did not come out particularly well during my hands-on time. Still, the fact that the Galaxy A57 manages to offer some serious competition to the S26 FE, despite it being $150 cheaper, is not a good look for the Fan Edition phone.</p><h2 id="upgrades-are-minimal">Upgrades are minimal</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Xs5ZNd73ZWhjVe5hE6rTjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE against A57 and Galaxy S26." src="https://cdn.mos.cms.futurecdn.net/Xs5ZNd73ZWhjVe5hE6rTjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>Incremental upgrades with few major hardware upgrades are not uncommon, and the Galaxy S26 FE seems to be the latest example of that to come from Samsung HQ. Checking over the specs compared to last year's Galaxy S25 FE really highlights how few upgrades there are this year. If you didn't know any better, you could easily mistake the S26 FE for an older model, and only real changes are the newer Exynos chipset and the glass enclosure around the rear camera lenses. </p><p>Everything else, from the cameras to the battery are essentially identical, which means Samsung is relying more on software upgrades to help sell the phone over its predecessors. Which is not a terrible plan, considering the number of flagship features Samsung has added to the Galaxy S26 FE. But it doesn't suggest that the phone is a must-have. Especially when you remember the Galaxy A57 exists.</p><h2 id="the-galaxy-a57-is-right-there">The Galaxy A57 is right there</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="WnVbdoxHAWjSTTJWxanJnR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE and A57 held in the hand." src="https://cdn.mos.cms.futurecdn.net/WnVbdoxHAWjSTTJWxanJnR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>The minimal upgrades wouldn't be so bad on their own, but we can't forget the fact that the Galaxy A57 is still around — and costs a good $150 less than the cheapest Galaxy S26 FE. There are a bunch of ways the Galaxy A57 falters compared to the S26 FE, particularly when it comes to performance and the availability of AI features. That price cut has to come from somewhere, and Samsung can't save all that money by cutting premium materials.</p><p>Still, at the same time, the A57 shares a lot of the same hardware with the Galaxy S26 FE. The camera hardware is more or less identical, and puts up a good fight against the S26 FE's cameras, and both screens share the same size, resolution and brightness. The A57's battery is actually larger, weirdly enough, and they both support up to 45W wired charging speeds — though the A57 lacks wireless charging.</p><p>We can't do a full comparison just yet, and we'll need to get the S26 FE into the lab to figure out exactly what its deal is. Because there's only so much you can glean from a list of hardware specs. Still, things don't look great. Especially considering the $50 price hike, and the fact that the 256GB Galaxy S26 costs the same as the equivalent FE.</p><h2 class="article-body__section" id="section-samsung-galaxy-s26-fe-hands-on-review-outlook"><span>Samsung Galaxy S26 FE hands-on review: Outlook</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GYNd6cPd7ZVnmCg7qSqYjR" name="Samsung Galaxy S26 FE hands-on" alt="Samsung Galaxy S26 FE in three colors." src="https://cdn.mos.cms.futurecdn.net/GYNd6cPd7ZVnmCg7qSqYjR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / Tom Pritchard)</span></figcaption></figure><p>The Galaxy S26 FE certainly shows promise, I'm struggling to understand why Samsung is releasing it in the first place. The Fan Edition series has been losing relevance for a while, especially now that Samsung is consistently releasing A-series phones in the U.S. and the Galaxy S26 FE doesn't really do much to help salvage the line-up's reputation in any way.</p><p>Based on my limited time with the phone, it seems that it is too similar to the Galaxy A57 to justify the higher price tag. At the same time, the price is too close to that of the Galaxy S26 to make many of these compromises worthwhile. It's that weird middle ground where it's not a cheap phone, but it's too cut back to be a true flagship.</p><p>So who is this phone for? It does offer more AI and Samsung-exclusive software features than cheaper options, and the fact that the 128GB storage option is still around means the cost of entry is noticeably lower. If you're an AI superfan that doesn't have a lot of money, this might be the Samsung phone for you, but otherwise you may as well pick up a different model.</p><p>Of course we'll have a much better idea of what the Galaxy S26 FE can do when we get the phone into the Tom's Guide lab for testing. That could change everything, or it could cement the idea that the S26 FE needs to die. We'll just have to wait and see.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy S27 Ultra design leaked — and it could cause ‘the most intense wave of criticism in Galaxy history’ ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Over the weekend, a series of renders and drawings purported to reveal a redesigned Samsung Galaxy S27 Ultra with some surprising subtractions. The images came from two prominent Samsung leaks and appear to show a new horizontal bar design that's more reminiscent of the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro</a> or a <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review">Google Pixel 11 Pro</a>. </p><p>The leaks started with a cryptic message from Samsung leaker Ice Universe, who posted a drawing and said, "I can't say anything."</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2091166586388562399"><p lang="en" dir="ltr">I can't say anything. pic.twitter.com/RmzMoPem12<a href="https://twitter.com/cantworkitout/status/2091166586388562399">August 22, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>They followed it up with a <a href="https://x.com/UniverseIce/status/2091391586081100096" target="_blank">full-body drawing</a> of the back of the phone. Those images appear to show a circle that is probably a Qi2 magnet for wireless charging. </p><p>From Ice Universe's sketches, it appears the Galaxy S27 Ultra loses a camera, going from the current triple stack to two, with the LED light and lenses in their own little pill. In another post, Universe noted that a new 5x telephoto lens will move into the LED pill and replace the current 3x version.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYdpAO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYdpAO.js" async></script><p>Yesterday, tipster <a href="https://x.com/SonnyDickson/status/2091487014181097967" target="_blank">Sonny Dickson posted</a> renders of the S27 Ultra, claiming that Samsung will offer the Ultra in two sizes. Rumors suggest Samsung is working on two sizes for the Ultra model, one of which will likely <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-pro-could-finally-be-the-smaller-ultra-phone-ive-been-waiting-for-heres-how">be the S27 Pro</a>. </p><p>It would make Samsung's offerings more similar to Apple's Pro and Pro Max models.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2091487014181097967"><p lang="en" dir="ltr">Here’s another look at the Samsung Galaxy S27 Ultra. Samsung is planning to offer the S27 Ultra in two different sizes. pic.twitter.com/3r84Vd82po<a href="https://twitter.com/cantworkitout/status/2091487014181097967">August 23, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Ice Universe seemed to confirm that the Pro model is coming today with <a href="https://x.com/UniverseIce/status/2091896398723813403/photo/1" target="_blank">new renders</a> and a post that claims the speaker on the bottom of the phone will be moved to the right side for the S27, S27 Plus and S27 Pro. The S27 Ultra will supposedly have its speaker on the left side.</p><p>Based on every drawing and render we've seen over the weekend, the new iPhone-esque plateau will only be available on the Ultra and Pro models. The base S27 and Plus models would have the stack.</p><p>With Samsung's foldables behind us, the rumor mill is starting to spin up in earnest for the company's flagship phone line. More renders will leak in the coming months, but we won't totally trust the leaks until we see some dummy units, which will probably leak in the fall.</p><p>As for the phones, Samsung will likely release the S27 lineup in the early part of next year. This year, the S26 series launched in February, and we expect Samsung will keep a similar schedule, give or take a week or two.</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/best-picks/best-samsung-phone">The best Samsung phone might not be the best for you — take our quiz to find out which you should buy</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-training-with-the-galaxy-watch-9-for-a-month-3-things-i-like-and-3-i-dont">I've been training with the Galaxy Watch 9 for a month — 3 things I like (and 3 I don't)</a></li><li><a href="http://tomsguide.com/us/best-android-phones,review-6051.html">We've tested the best Android phones available right now from Samsung, Google and Motorola</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-design-leaked-and-it-could-cause-the-most-intense-wave-of-criticism-in-galaxy-history</link>
                                                                            <description>
                            <![CDATA[ An alleged render of the Samsung Galaxy S27 Ultra reveals a very iPhone-esque design and a missing camera. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">C7PmMG8uYShfNvyW2kSPAN</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 24 Aug 2026 17:53:22 +0000</pubDate>                                                                                                                                <updated>Mon, 24 Aug 2026 23:13:21 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg">
                                                            <media:credit><![CDATA[@TechHome100]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy S27 Ultra render]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy S27 Ultra render]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy S27 Ultra render]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/LacgYzjqWKVkFAs6DKZ3ak-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Over the weekend, a series of renders and drawings purported to reveal a redesigned Samsung Galaxy S27 Ultra with some surprising subtractions. The images came from two prominent Samsung leaks and appear to show a new horizontal bar design that's more reminiscent of the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro</a> or a <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-pro-xl-review">Google Pixel 11 Pro</a>. </p><p>The leaks started with a cryptic message from Samsung leaker Ice Universe, who posted a drawing and said, "I can't say anything."</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2091166586388562399"><p lang="en" dir="ltr">I can't say anything. pic.twitter.com/RmzMoPem12<a href="https://twitter.com/cantworkitout/status/2091166586388562399">August 22, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>They followed it up with a <a href="https://x.com/UniverseIce/status/2091391586081100096" target="_blank">full-body drawing</a> of the back of the phone. Those images appear to show a circle that is probably a Qi2 magnet for wireless charging. </p><p>From Ice Universe's sketches, it appears the Galaxy S27 Ultra loses a camera, going from the current triple stack to two, with the LED light and lenses in their own little pill. In another post, Universe noted that a new 5x telephoto lens will move into the LED pill and replace the current 3x version.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYdpAO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYdpAO.js" async></script><p>Yesterday, tipster <a href="https://x.com/SonnyDickson/status/2091487014181097967" target="_blank">Sonny Dickson posted</a> renders of the S27 Ultra, claiming that Samsung will offer the Ultra in two sizes. Rumors suggest Samsung is working on two sizes for the Ultra model, one of which will likely <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-pro-could-finally-be-the-smaller-ultra-phone-ive-been-waiting-for-heres-how">be the S27 Pro</a>. </p><p>It would make Samsung's offerings more similar to Apple's Pro and Pro Max models.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2091487014181097967"><p lang="en" dir="ltr">Here’s another look at the Samsung Galaxy S27 Ultra. Samsung is planning to offer the S27 Ultra in two different sizes. pic.twitter.com/3r84Vd82po<a href="https://twitter.com/cantworkitout/status/2091487014181097967">August 23, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><p>Ice Universe seemed to confirm that the Pro model is coming today with <a href="https://x.com/UniverseIce/status/2091896398723813403/photo/1" target="_blank">new renders</a> and a post that claims the speaker on the bottom of the phone will be moved to the right side for the S27, S27 Plus and S27 Pro. The S27 Ultra will supposedly have its speaker on the left side.</p><p>Based on every drawing and render we've seen over the weekend, the new iPhone-esque plateau will only be available on the Ultra and Pro models. The base S27 and Plus models would have the stack.</p><p>With Samsung's foldables behind us, the rumor mill is starting to spin up in earnest for the company's flagship phone line. More renders will leak in the coming months, but we won't totally trust the leaks until we see some dummy units, which will probably leak in the fall.</p><p>As for the phones, Samsung will likely release the S27 lineup in the early part of next year. This year, the S26 series launched in February, and we expect Samsung will keep a similar schedule, give or take a week or two.</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/best-picks/best-samsung-phone">The best Samsung phone might not be the best for you — take our quiz to find out which you should buy</a></li><li><a href="https://www.tomsguide.com/wellness/smartwatches/ive-been-training-with-the-galaxy-watch-9-for-a-month-3-things-i-like-and-3-i-dont">I've been training with the Galaxy Watch 9 for a month — 3 things I like (and 3 I don't)</a></li><li><a href="http://tomsguide.com/us/best-android-phones,review-6051.html">We've tested the best Android phones available right now from Samsung, Google and Motorola</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I've spent more than three weeks using the Galaxy Z Flip 8 — and it's a tipping point for Samsung ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When it comes to the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>, I strongly prefer flip-style ones for their compact footprint and effortless one-handed use. On top of that, they’re undeniably far more versatile for vlogging than notebook-style foldables, letting me frame shots on the outer cover screen using the superior rear cameras.</p><p>For years, I’ve praised Samsung’s flip-style foldables — but this year’s <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Galaxy Z Flip 8</a> has me concerned. It’s not just that it represents the most painfully lazy upgrade in the series’ history, but also that Samsung’s focus seems to have largely shifted elsewhere.</p><p>Pairing that with the glowing reception for the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>, and it’s clear Samsung is at a tipping point with its Z Flip line. Here’s why.</p><h2 id="motorola-has-a-way-more-robust-selection">Motorola has a way more robust selection</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4206px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GjM8ydranBDXssmEh3cvRj" name="Motorola Razr 2026 lineup tested" alt="Motorola Razr 2026 lineup." src="https://cdn.mos.cms.futurecdn.net/GjM8ydranBDXssmEh3cvRj-1920-80.jpg" mos="" align="middle" fullscreen="" width="4206" height="2366" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Despite being an early pioneer in the space, Motorola lagged behind Samsung for years with its Razr phones, plagued by awkward hinge designs and lackluster performance. But the narrative has shifted dramatically over the last couple of generations.</p><p>Instead of treating clamshell foldables as a one-size-fits-all product, Motorola built out a lineup with broader appeal. That strategy has culminated in today's lineup of three clamshell foldables alongside a book-style model. By offering varied price points, Motorola gives consumers the freedom to choose what fits their budget and needs. In contrast, Samsung has stuck to releasing just a single flip phone each generation.</p><h2 id="cameras-are-not-an-afterthought">Cameras are not an afterthought</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/UL8HcuGXKj4q6JFezkyoUK-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GTZRj6Pi6VoQvknNv7ADYM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jTfJDamBtu5bVLWN9TRoTM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9DnE3sjaZEFBMSTVNRuNZM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xM7Loc7doDCM5mAG5sV5eM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/sXRnQXvyTmJmUAJLFSiycM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/U7ppHAi6rmZbkgichjv3fM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ra7Tg3hxXTr9CUfn4TY9gM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/heCfmP4RcTc3n6J22o7GgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jZPuqwFNhDX5WWQNh9QBhM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/5onDrXP74YsoPKX5vazGgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QuqAkomxsfvBfgLxc99hgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/3sH7sebhf5GF7Au2mm35yM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/e6Ga8L5yoJTj5v5xLX7y2N-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/voxAjzxdgWsXvkHXR2baoM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gD4hisXb9eYHtNFirB9ZrM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Just as crucially, the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Razr Ultra (2026)</a> finally dismantles the long-standing stereotype that Motorola’s flip cameras are an afterthought. With upgraded high-resolution sensors, refined image processing, and superior low-light performance, it no longer forces users to compromise camera quality for pocketability. Just look at some of the snapshots I captured above to see how far Motorola's has come.</p><h2 id="no-mention-of-a-galaxy-z-flip-fe-this-time">No mention of a Galaxy Z Flip FE this 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qgy6nXqaJrnUHJ7HwpbdXY" name="Samsung Galaxy Z Flip 7 FE-01-LIST" alt="Samsung Galaxy Z Fold 7 FE tent mode" src="https://cdn.mos.cms.futurecdn.net/Qgy6nXqaJrnUHJ7HwpbdXY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Perhaps the most glaring absence at Unpacked was any sign of a Galaxy Z Flip FE follow-up. When the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-fe-review">Galaxy Z Flip 7 FE</a> launched alongside the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection">Z Flip 7 </a>last year, my colleagues and I were highly critical of the move — one we felt wasn't necessary since it was essentially a rebadged <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-6-review">Z Flip 6</a>. It certainly didn't help that it still carried a hefty $899 price tag.</p><p>Making matters worse, Samsung didn't just stick to minor hardware upgrades for the Flip 8 — it also tacked on a $100 price bump. In my <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Galaxy Z Flip 8 review</a>, I noted that "Samsung's baby-step approach feels tough to defend."</p><p>While the switch back to a flagship Qualcomm chip delivers notable performance gains, I was shocked by the negligible battery life improvements. Instead of adopting the ultra-thin profile of the Z Fold 8 or delivering substantial hardware innovations, the Z Flip 8 feels more like yet another rehash.</p><h2 id="i-want-a-galaxy-s27-ultra-flip">I want a Galaxy S27 Ultra Flip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4397px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="MMrH9wwYJUAMMEM4PEkYTJ" name="Galaxy-S26-Ultra-review-18" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/MMrH9wwYJUAMMEM4PEkYTJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4397" height="2473" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If the Z Flip line is going to survive, Samsung needs to stop playing it safe and introduce a true Ultra model. We’ve seen the company pour top-tier resources into the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26 Ultra</a> and the Z Fold 8 Ultra — and the flip form factor deserves that exact same flagship treatment.</p><p>The most logical candidate would be something along the lines of a Galaxy S27 Ultra Flip. To truly make a statement, it would require an ultra-thin chassis, uncompromising battery life, and, crucially, a versatile triple-camera system that finally brings a dedicated telephoto lens to a Samsung clamshell.</p><p>Packing that level of hardware into a flip phone would inevitably command a steeper price tag. But considering what buyers are already willing to shell out for premium competitors like the Razr Ultra (2026), power users and creators would happily pay for a clamshell that refuses to cut corners.</p><p>Samsung has reached a critical tipping point with the Z Flip series. Iterative spec bumps and unjustified price hikes won't cut it anymore — the lineup desperately needs a major overhaul to breathe real excitement back into the category.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwqxAX"></div>                            </div>                            <script src="https://kwizly.com/embed/WwqxAX.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/phones/google-pixel-phones/google-bamboozled-me-into-paying-for-google-photos-a-decade-ago-and-now-its-doing-something-similar-with-the-pixel-11-pro">Google bamboozled me into paying for Google Photos a decade ago — and now it’s doing something similar with the Pixel 11 Pro</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/i-held-the-pixel-tag-and-it-does-one-critical-thing-that-the-airtag-doesnt-heres-what-it-is">I held the Pixel Tag and it does one critical thing that the AirTag doesn’t — here’s what it is</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/i-tried-the-pixel-11-pro-fold-and-its-more-ultra-than-samsungs-foldable-for-usd200-less">I tried the Pixel 11 Pro Fold and it's more 'Ultra' than Samsung's foldable (for $200 less)</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/ive-spent-more-than-three-weeks-using-the-galaxy-z-flip-8-and-its-a-tipping-point-for-samsung</link>
                                                                            <description>
                            <![CDATA[ Samsung has long dominated the flip-phone form factor, but the release of the Galaxy Z Flip 8 has put the series in serious doubt. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Fssbj2YJX3crGjn4h3JqyF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sFX3dd6Le7GcZSuThSyjS6-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 16 Aug 2026 07:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sFX3dd6Le7GcZSuThSyjS6-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / John Velasco]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Flip 8 review.]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Flip 8 review.]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Flip 8 review.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sFX3dd6Le7GcZSuThSyjS6-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When it comes to the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>, I strongly prefer flip-style ones for their compact footprint and effortless one-handed use. On top of that, they’re undeniably far more versatile for vlogging than notebook-style foldables, letting me frame shots on the outer cover screen using the superior rear cameras.</p><p>For years, I’ve praised Samsung’s flip-style foldables — but this year’s <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Galaxy Z Flip 8</a> has me concerned. It’s not just that it represents the most painfully lazy upgrade in the series’ history, but also that Samsung’s focus seems to have largely shifted elsewhere.</p><p>Pairing that with the glowing reception for the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>, and it’s clear Samsung is at a tipping point with its Z Flip line. Here’s why.</p><h2 id="motorola-has-a-way-more-robust-selection">Motorola has a way more robust selection</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4206px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="GjM8ydranBDXssmEh3cvRj" name="Motorola Razr 2026 lineup tested" alt="Motorola Razr 2026 lineup." src="https://cdn.mos.cms.futurecdn.net/GjM8ydranBDXssmEh3cvRj-1920-80.jpg" mos="" align="middle" fullscreen="" width="4206" height="2366" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Despite being an early pioneer in the space, Motorola lagged behind Samsung for years with its Razr phones, plagued by awkward hinge designs and lackluster performance. But the narrative has shifted dramatically over the last couple of generations.</p><p>Instead of treating clamshell foldables as a one-size-fits-all product, Motorola built out a lineup with broader appeal. That strategy has culminated in today's lineup of three clamshell foldables alongside a book-style model. By offering varied price points, Motorola gives consumers the freedom to choose what fits their budget and needs. In contrast, Samsung has stuck to releasing just a single flip phone each generation.</p><h2 id="cameras-are-not-an-afterthought">Cameras are not an afterthought</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/UL8HcuGXKj4q6JFezkyoUK-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GTZRj6Pi6VoQvknNv7ADYM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jTfJDamBtu5bVLWN9TRoTM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/9DnE3sjaZEFBMSTVNRuNZM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xM7Loc7doDCM5mAG5sV5eM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/sXRnQXvyTmJmUAJLFSiycM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/U7ppHAi6rmZbkgichjv3fM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ra7Tg3hxXTr9CUfn4TY9gM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/heCfmP4RcTc3n6J22o7GgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jZPuqwFNhDX5WWQNh9QBhM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/5onDrXP74YsoPKX5vazGgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QuqAkomxsfvBfgLxc99hgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/3sH7sebhf5GF7Au2mm35yM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/e6Ga8L5yoJTj5v5xLX7y2N-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/voxAjzxdgWsXvkHXR2baoM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Galaxy Z Flip 8.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gD4hisXb9eYHtNFirB9ZrM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra (2026).<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Just as crucially, the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Razr Ultra (2026)</a> finally dismantles the long-standing stereotype that Motorola’s flip cameras are an afterthought. With upgraded high-resolution sensors, refined image processing, and superior low-light performance, it no longer forces users to compromise camera quality for pocketability. Just look at some of the snapshots I captured above to see how far Motorola's has come.</p><h2 id="no-mention-of-a-galaxy-z-flip-fe-this-time">No mention of a Galaxy Z Flip FE this 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Qgy6nXqaJrnUHJ7HwpbdXY" name="Samsung Galaxy Z Flip 7 FE-01-LIST" alt="Samsung Galaxy Z Fold 7 FE tent mode" src="https://cdn.mos.cms.futurecdn.net/Qgy6nXqaJrnUHJ7HwpbdXY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Perhaps the most glaring absence at Unpacked was any sign of a Galaxy Z Flip FE follow-up. When the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-fe-review">Galaxy Z Flip 7 FE</a> launched alongside the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection">Z Flip 7 </a>last year, my colleagues and I were highly critical of the move — one we felt wasn't necessary since it was essentially a rebadged <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-6-review">Z Flip 6</a>. It certainly didn't help that it still carried a hefty $899 price tag.</p><p>Making matters worse, Samsung didn't just stick to minor hardware upgrades for the Flip 8 — it also tacked on a $100 price bump. In my <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Galaxy Z Flip 8 review</a>, I noted that "Samsung's baby-step approach feels tough to defend."</p><p>While the switch back to a flagship Qualcomm chip delivers notable performance gains, I was shocked by the negligible battery life improvements. Instead of adopting the ultra-thin profile of the Z Fold 8 or delivering substantial hardware innovations, the Z Flip 8 feels more like yet another rehash.</p><h2 id="i-want-a-galaxy-s27-ultra-flip">I want a Galaxy S27 Ultra Flip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4397px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="MMrH9wwYJUAMMEM4PEkYTJ" name="Galaxy-S26-Ultra-review-18" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/MMrH9wwYJUAMMEM4PEkYTJ-1920-80.jpg" mos="" align="middle" fullscreen="" width="4397" height="2473" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If the Z Flip line is going to survive, Samsung needs to stop playing it safe and introduce a true Ultra model. We’ve seen the company pour top-tier resources into the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26 Ultra</a> and the Z Fold 8 Ultra — and the flip form factor deserves that exact same flagship treatment.</p><p>The most logical candidate would be something along the lines of a Galaxy S27 Ultra Flip. To truly make a statement, it would require an ultra-thin chassis, uncompromising battery life, and, crucially, a versatile triple-camera system that finally brings a dedicated telephoto lens to a Samsung clamshell.</p><p>Packing that level of hardware into a flip phone would inevitably command a steeper price tag. But considering what buyers are already willing to shell out for premium competitors like the Razr Ultra (2026), power users and creators would happily pay for a clamshell that refuses to cut corners.</p><p>Samsung has reached a critical tipping point with the Z Flip series. Iterative spec bumps and unjustified price hikes won't cut it anymore — the lineup desperately needs a major overhaul to breathe real excitement back into the category.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WwqxAX"></div>                            </div>                            <script src="https://kwizly.com/embed/WwqxAX.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/phones/google-pixel-phones/google-bamboozled-me-into-paying-for-google-photos-a-decade-ago-and-now-its-doing-something-similar-with-the-pixel-11-pro">Google bamboozled me into paying for Google Photos a decade ago — and now it’s doing something similar with the Pixel 11 Pro</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/i-held-the-pixel-tag-and-it-does-one-critical-thing-that-the-airtag-doesnt-heres-what-it-is">I held the Pixel Tag and it does one critical thing that the AirTag doesn’t — here’s what it is</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/i-tried-the-pixel-11-pro-fold-and-its-more-ultra-than-samsungs-foldable-for-usd200-less">I tried the Pixel 11 Pro Fold and it's more 'Ultra' than Samsung's foldable (for $200 less)</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I’ve been living with the Galaxy Z Fold 8 for 3 weeks — and I was wrong ]]></title>
                                                                                                <dc:content><![CDATA[ <p>If there’s one thing I’ve learned in testing phones for over 20 years, it’s that there’s a difference between reviewing a device and living with it. And now that I’ve spent three weeks with the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8</a>, I can say that my opinion has changed and that I was right about some things — and wrong about some others.</p><h2 id="the-cameras-are-good-enough">The cameras are good enough!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="c7J7KZ5TxP3SDSB6ALAg2k" name="Samsung Galaxy Z Fold 8--6" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/c7J7KZ5TxP3SDSB6ALAg2k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>First, let’s talk about the cameras. I stand by what I initially wrote about it being a bummer that the Fold 8 doesn’t have a telephoto zoom. For $1,900 you deserve one. But I have since tested the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200"><u>Fold 8 vs the 3x optical zoom on the Fold 8 Ultra</u></a> in a series of tests and I didn’t notice a huge difference until I got to 10x.</p><p>My point here is that you can more than get by with the Fold 8’s dual rear shooters. And I especially appreciate the improved low-light performance versus the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"><u>Fold 7</u></a>. The Nightography is just better.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/jnafuqsfupeaSFjL8qo5zj-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/zs9fisEBmvsJDfWkYetdAk-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/78txuj8kx9KcDFHxJ3fB7k-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/P6qeQHWiWXPmgMCv4LtZDk-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Su2cj7sQBhiLcjkNw2zjCk-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>If you really care about zoom performance, you’re better off getting the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review"><u>Samsung Galaxy S26 Ultra</u></a> and its 5x optical zoom, or going with a different foldable altogether with the <a href="https://www.tomsguide.com/phones/google-pixel-phones/i-tried-the-pixel-11-pro-fold-and-its-more-ultra-than-samsungs-foldable-for-usd200-less"><u>Google Pixel 11 Pro Fold</u></a>, which also packs a 5x telephoto. </p><div class="product"><a data-dimension112="3f453eba-9761-11f1-aa14-ff4c85a5a9f0" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="vZVLkgJrMPPWhKGBnWrT63" name="9Rhpe6TtrVFSNo9Vtn27Tm" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vZVLkgJrMPPWhKGBnWrT63-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="3f453eba-9761-11f1-aa14-ff4c85a5a9f0" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,000 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,000 off Galaxy Z Fold 8 preorders when you trade-in an older phone. The phone features an 7.6-inch OLED main display, 5.5-inch cover screen, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8 review</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but you get a greatly reduced crease, brighter main screen and lighter design.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="3f453eba-9761-11f1-aa14-ff4c85a5a9f0" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><h2 id="no-flex-view-is-not-a-dealbreaker">No Flex View is not a dealbreaker</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3806px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yy29a3yqPwGSdSqoT7oPPX" name="Galaxy Z Fold 8-9" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/yy29a3yqPwGSdSqoT7oPPX-1920-80.jpg" mos="" align="middle" fullscreen="" width="3806" height="2141" attribution="" endorsement="" class="inline"></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 ability to use your foldable phone as a mini laptop certainly comes in handy, but the Fold 8 ditches this feature because of the way the hinge is designed. So, for example, you can’t play videos with the content up top and controls down below. Or take a Google Meet call without having to hold the phone.</p><p>It’s a bummer, but at least there’s a hands-free alternative for watching videos. You can just use the outer display on the Fold 8 and put it in tent mode. It’s a nifty way for me to catch up on that day’s First Take episode while I’m on lunch break at work or doing the dishes.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exVp2O"></div>                            </div>                            <script src="https://kwizly.com/embed/exVp2O.js" async></script><h2 id="tiktok-is-dangerously-addictive-youtube-shorts-needs-a-fix">TikTok Is dangerously addictive. YouTube Shorts needs a fix</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nrCY8poLdeA4rgB6PXAX9k" name="Samsung Galaxy Z Fold 8--10" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/nrCY8poLdeA4rgB6PXAX9k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I admit that I scroll on TikTok way too much, but my addiction has gotten worse on the Fold 8. That’s because the front display is perfect for snacking content while I’m waiting for my bus ride home.</p><p>Open up to the main 7.6-inch display, and TikTok is even better if you love to read comments. They pop in from the right side in a dual-pane format. Even better, as you scroll through TikTok’s with the comments upon, they’ll automatically refresh for each 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YH4cXbfN7jtTxuwSe7HsCk" name="Samsung Galaxy Z Fold 8--9" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/YH4cXbfN7jtTxuwSe7HsCk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Too bad YouTube Shorts isn’t similarly optimized. You have to X out of the comments before you scroll to the next video, which is dumb. This also speaks to my issue with apps in general on the Galaxy Fold — too many aren’t optimized for the wider display. It’s something Samsung is going to have to fix, because you know Apple will be working with developers to make sure apps look amazing on the iPhone Fold/Ultra.</p><h2 id="the-shape-is-just-right-but-not-in-my-pocket">The shape is just right (but not in my pocket)</h2><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="MSbku8TL3Wz9tTKEpq2AwU" name="Galaxy Z Fold 8 pants" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/MSbku8TL3Wz9tTKEpq2AwU-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Initially I thought the Galaxy Z Fold 8 might be awkwardly wide when closed, especially when trying to use the phone quickly with one hand to scroll through notifications. But overall I haven’t had any issues, and I find myself responding to Slack messages on the cover display all the time.</p><p>When I’m on the go, however, I’ve found that the wide design of the Fold 8 is actually not as comfy in my front pocket as the Fold 8 Ultra. The former’s wider body is a bit more awkward when I’m walking. So I often put the Fold 8 in my back pocket instead.</p><h2 id="it-s-my-new-favorite-e-reader">It’s my new favorite e-reader</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MaDJdLutEFff7YMHqdY89k" name="Samsung Galaxy Z Fold 8--11" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/MaDJdLutEFff7YMHqdY89k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve been trying to get back into reading more, starting with Joanna Stern’s <a href="https://www.amazon.com/Am-Not-Robot-Almost-Everything/dp/0063446618"><u>“I Am Not a Robot,”</u></a> which is about her journey of using nothing but AI tools for a year. And the Fold 8 is the perfect e-reader stand-in for two reasons. </p><p>One, when you flip around the main display you get a 3:4 aspect ratio that’s very Kindle-like. And, two, the anti-reflective coating makes reading outside a lot easier than I thought. There’s a lot less glare than previous foldables.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PopQKSSXA7u8J8bvFcYMBk" name="Samsung Galaxy Z Fold 8--7" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/PopQKSSXA7u8J8bvFcYMBk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Plus, as I get ready for “Avengers: Doomsday,” I asked Gemini which Marvel comics I should be ready to get up to speed on Dr. Doom’s origin and powers. So I subscribed to Marvel Ultimate and I find the Fold 8 is a pretty sweet format for diving in.</p><h2 id="how-good-is-the-battery-life">How good is the battery life?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hQ292cJhTMbbBXemmfWj7k" name="Samsung Galaxy Z Fold 8--8" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/hQ292cJhTMbbBXemmfWj7k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now that I’ve been using the Fold 8 as a daily driver, I’ve discovered that it has pretty good staying power. On most days starting at 7 am with moderate usage — which includes streaming Spotify on the go, checking Slack and email, and watching videos to and from on my commute — I’m down to about 45 to 50% by the time I get home around 7 pm. </p><p>That’s pretty solid for one of Samsung’s first silicon carbon batteries.</p><h2 id="bottom-line-2">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bDJUk5j4owJX4KvApygKBk" name="Samsung Galaxy Z Fold 8--5" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/bDJUk5j4owJX4KvApygKBk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The best thing I can say about the Galaxy Z Fold 8 is that it’s really growing on me. My initial skepticism around why the world needs a wide foldable phone has now all but been erased. And despite how Samsung is marketing this device as an ultimate content consumption phone I think it’s a great device for productivity. </p><p>You can still run up to three apps at once like on the Fold 8 Ultra. You just don’t get the same height for fitting more content on screen, though flipping around to 3:4 mode helps for the main display. I think this could very well be the foldable to beat, and the upcoming iPhone Ultra has a high bar to clear.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/ive-been-living-with-the-galaxy-z-fold-8-for-3-weeks-and-i-was-wrong</link>
                                                                            <description>
                            <![CDATA[ I’ve spent a lot of time using the Samsung Galaxy Z Fold 8, and many of the so-called cons pale in comparison to how good this foldable phone actually feels and and works in everyday life. Here’s my updated pros and cons. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">fdtw7nPYTr6mhqtawZZYKV</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/xKVKRBo6b2JwL3kkRiuBCk-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 14 Aug 2026 07:15:00 +0000</pubDate>                                                                                                                                <updated>Fri, 14 Aug 2026 12:15:06 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/xKVKRBo6b2JwL3kkRiuBCk-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/xKVKRBo6b2JwL3kkRiuBCk-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>If there’s one thing I’ve learned in testing phones for over 20 years, it’s that there’s a difference between reviewing a device and living with it. And now that I’ve spent three weeks with the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8</a>, I can say that my opinion has changed and that I was right about some things — and wrong about some others.</p><h2 id="the-cameras-are-good-enough">The cameras are good enough!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="c7J7KZ5TxP3SDSB6ALAg2k" name="Samsung Galaxy Z Fold 8--6" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/c7J7KZ5TxP3SDSB6ALAg2k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>First, let’s talk about the cameras. I stand by what I initially wrote about it being a bummer that the Fold 8 doesn’t have a telephoto zoom. For $1,900 you deserve one. But I have since tested the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200"><u>Fold 8 vs the 3x optical zoom on the Fold 8 Ultra</u></a> in a series of tests and I didn’t notice a huge difference until I got to 10x.</p><p>My point here is that you can more than get by with the Fold 8’s dual rear shooters. And I especially appreciate the improved low-light performance versus the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"><u>Fold 7</u></a>. The Nightography is just better.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/jnafuqsfupeaSFjL8qo5zj-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/zs9fisEBmvsJDfWkYetdAk-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/78txuj8kx9KcDFHxJ3fB7k-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/P6qeQHWiWXPmgMCv4LtZDk-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Su2cj7sQBhiLcjkNw2zjCk-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>If you really care about zoom performance, you’re better off getting the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review"><u>Samsung Galaxy S26 Ultra</u></a> and its 5x optical zoom, or going with a different foldable altogether with the <a href="https://www.tomsguide.com/phones/google-pixel-phones/i-tried-the-pixel-11-pro-fold-and-its-more-ultra-than-samsungs-foldable-for-usd200-less"><u>Google Pixel 11 Pro Fold</u></a>, which also packs a 5x telephoto. </p><div class="product"><a data-dimension112="3f453eba-9761-11f1-aa14-ff4c85a5a9f0" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="vZVLkgJrMPPWhKGBnWrT63" name="9Rhpe6TtrVFSNo9Vtn27Tm" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/vZVLkgJrMPPWhKGBnWrT63-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="3f453eba-9761-11f1-aa14-ff4c85a5a9f0" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,000 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,000 off Galaxy Z Fold 8 preorders when you trade-in an older phone. The phone features an 7.6-inch OLED main display, 5.5-inch cover screen, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8 review</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but you get a greatly reduced crease, brighter main screen and lighter design.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="3f453eba-9761-11f1-aa14-ff4c85a5a9f0" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><h2 id="no-flex-view-is-not-a-dealbreaker">No Flex View is not a dealbreaker</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3806px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yy29a3yqPwGSdSqoT7oPPX" name="Galaxy Z Fold 8-9" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/yy29a3yqPwGSdSqoT7oPPX-1920-80.jpg" mos="" align="middle" fullscreen="" width="3806" height="2141" attribution="" endorsement="" class="inline"></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 ability to use your foldable phone as a mini laptop certainly comes in handy, but the Fold 8 ditches this feature because of the way the hinge is designed. So, for example, you can’t play videos with the content up top and controls down below. Or take a Google Meet call without having to hold the phone.</p><p>It’s a bummer, but at least there’s a hands-free alternative for watching videos. You can just use the outer display on the Fold 8 and put it in tent mode. It’s a nifty way for me to catch up on that day’s First Take episode while I’m on lunch break at work or doing the dishes.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exVp2O"></div>                            </div>                            <script src="https://kwizly.com/embed/exVp2O.js" async></script><h2 id="tiktok-is-dangerously-addictive-youtube-shorts-needs-a-fix">TikTok Is dangerously addictive. YouTube Shorts needs a fix</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nrCY8poLdeA4rgB6PXAX9k" name="Samsung Galaxy Z Fold 8--10" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/nrCY8poLdeA4rgB6PXAX9k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I admit that I scroll on TikTok way too much, but my addiction has gotten worse on the Fold 8. That’s because the front display is perfect for snacking content while I’m waiting for my bus ride home.</p><p>Open up to the main 7.6-inch display, and TikTok is even better if you love to read comments. They pop in from the right side in a dual-pane format. Even better, as you scroll through TikTok’s with the comments upon, they’ll automatically refresh for each 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YH4cXbfN7jtTxuwSe7HsCk" name="Samsung Galaxy Z Fold 8--9" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/YH4cXbfN7jtTxuwSe7HsCk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Too bad YouTube Shorts isn’t similarly optimized. You have to X out of the comments before you scroll to the next video, which is dumb. This also speaks to my issue with apps in general on the Galaxy Fold — too many aren’t optimized for the wider display. It’s something Samsung is going to have to fix, because you know Apple will be working with developers to make sure apps look amazing on the iPhone Fold/Ultra.</p><h2 id="the-shape-is-just-right-but-not-in-my-pocket">The shape is just right (but not in my pocket)</h2><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="MSbku8TL3Wz9tTKEpq2AwU" name="Galaxy Z Fold 8 pants" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/MSbku8TL3Wz9tTKEpq2AwU-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Initially I thought the Galaxy Z Fold 8 might be awkwardly wide when closed, especially when trying to use the phone quickly with one hand to scroll through notifications. But overall I haven’t had any issues, and I find myself responding to Slack messages on the cover display all the time.</p><p>When I’m on the go, however, I’ve found that the wide design of the Fold 8 is actually not as comfy in my front pocket as the Fold 8 Ultra. The former’s wider body is a bit more awkward when I’m walking. So I often put the Fold 8 in my back pocket instead.</p><h2 id="it-s-my-new-favorite-e-reader">It’s my new favorite e-reader</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MaDJdLutEFff7YMHqdY89k" name="Samsung Galaxy Z Fold 8--11" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/MaDJdLutEFff7YMHqdY89k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’ve been trying to get back into reading more, starting with Joanna Stern’s <a href="https://www.amazon.com/Am-Not-Robot-Almost-Everything/dp/0063446618"><u>“I Am Not a Robot,”</u></a> which is about her journey of using nothing but AI tools for a year. And the Fold 8 is the perfect e-reader stand-in for two reasons. </p><p>One, when you flip around the main display you get a 3:4 aspect ratio that’s very Kindle-like. And, two, the anti-reflective coating makes reading outside a lot easier than I thought. There’s a lot less glare than previous foldables.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PopQKSSXA7u8J8bvFcYMBk" name="Samsung Galaxy Z Fold 8--7" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/PopQKSSXA7u8J8bvFcYMBk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Plus, as I get ready for “Avengers: Doomsday,” I asked Gemini which Marvel comics I should be ready to get up to speed on Dr. Doom’s origin and powers. So I subscribed to Marvel Ultimate and I find the Fold 8 is a pretty sweet format for diving in.</p><h2 id="how-good-is-the-battery-life">How good is the battery life?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="hQ292cJhTMbbBXemmfWj7k" name="Samsung Galaxy Z Fold 8--8" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/hQ292cJhTMbbBXemmfWj7k-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now that I’ve been using the Fold 8 as a daily driver, I’ve discovered that it has pretty good staying power. On most days starting at 7 am with moderate usage — which includes streaming Spotify on the go, checking Slack and email, and watching videos to and from on my commute — I’m down to about 45 to 50% by the time I get home around 7 pm. </p><p>That’s pretty solid for one of Samsung’s first silicon carbon batteries.</p><h2 id="bottom-line-2">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bDJUk5j4owJX4KvApygKBk" name="Samsung Galaxy Z Fold 8--5" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/bDJUk5j4owJX4KvApygKBk-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The best thing I can say about the Galaxy Z Fold 8 is that it’s really growing on me. My initial skepticism around why the world needs a wide foldable phone has now all but been erased. And despite how Samsung is marketing this device as an ultimate content consumption phone I think it’s a great device for productivity. </p><p>You can still run up to three apps at once like on the Fold 8 Ultra. You just don’t get the same height for fitting more content on screen, though flipping around to 3:4 mode helps for the main display. I think this could very well be the foldable to beat, and the upcoming iPhone Ultra has a high bar to clear.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Does the Galaxy Z Fold 8 Ultra make the most use of its screen space? I streamed a bunch of movies and TV shows to find out ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When it comes to streaming movies and TV shows, a larger screen is usually considered the better option. But, that only really works if the screen shape actually conforms to the aspect ratio of the content in question. That's not an issue for most phones or tablet screens, but what about the larger, oddly-shaped foldable displays like the one on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Samsung Galaxy Z Fold 8 Ultra</a>?</p><p>I've been testing the Z Fold 8 Ultra for the past few weeks, and it shouldn't surprise anyone that watching video on the larger display means I also have to contend with large areas of blank space around the video. This can be rather irritating, especially in brighter environments that highlight both the display crease and my own reflection.</p><div class="product"><a data-dimension112="13ad7924-9271-11f1-a833-6bcbee429b16" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2098" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="13ad7924-9271-11f1-a833-6bcbee429b16" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2098">Galaxy Z Fold 8 Ultra: $2098</a></strong><br>The price may have gone up (again), there are are still plenty of reasons to pick up the Z Fold 8 Ultra. There's a large 8-inch foldable display hiding away, alongside a 6.5-inch cover display, trio of main cameras (with a 200MP main lens), powerful performance and excellent battery life.</p><p>Amazon is currently giving away a $350 gift card with each purchase too.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="13ad7924-9271-11f1-a833-6bcbee429b16" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2098">View Deal</a></p></div><p>But as many people will no doubt point out, there are multiple ways to watch videos on the Galaxy Z Fold 8 Ultra. There's the cover display which, while narrower than most phones, offers a traditional viewing experience. The foldable display can also be oriented in portrait or landscape modes, and switching between the two flips the aspect ratio. </p><p>While this may not seem like a big deal, the Z Fold 8 Ultra isn't a perfect square, and that means the flip also changes how video content sits on your phone. But which mode is the better way to watch stuff? I tested the Z Fold 8 Ultra's three viewing experiences against the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> to find out.</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/oFT-YOrakEg" allowfullscreen></iframe></div></div><h2 id="how-i-tested-the-screens">How I tested the screens</h2><p>It's easy to load up some content on a screen and rely on vibes alone to make your conclusion, but I took things a step further by actively measuring everything on screen. This started with the screen itself, measuring between the bezels and calculating the amount of screen space that is actually available.</p><p>I should caveat at this point that this is only a rough calculation, because all four phones have curved corners. This is less of an issue on the Z Fold 8 Ultra because those curves are very slight. However the iPhone 17 Pro Max's corners are larger and more rounded, which means the total screen area is slightly smaller than the math suggests.</p><p>Once the total area of each display was calculated, I got to work streaming, throwing up a bunch of different kinds of content and measuring how much screen space they took up. Content included:</p><ul><li>"X-Men (2000)" (2:39:1) purchased on YouTube</li><li>"X-Men-97" (2:35:1)  on Disney Plus</li><li>"The Emperor's New Groove" (16:9) on Disney Plus</li><li>"Scrubs" (2001) (4:3) on Disney Plus</li><li>"Avengers: Endgame" (2:39:1) on Disney Plus</li><li>"Avengers: Endgame IMAX Enhanced Edition" (1:9:1) on Disney Plus</li><li>Various vertical videos on TikTok</li></ul><p>I set up each video playing on the four screen types, then measured how large each video was. With that in hand, I was able to work out just how much screen space they actually used, and thus, how much space is just sitting there going to waste. Crucially, this means I can figure out the best option for watching content in something close to a full-screen experience.</p><p>I should also note that while a lot of streaming platforms offer a "zoom to fill" option on smart phones and tablets, I have not taken this into account since that essentially crops the video and means you don't see everything that's going on.</p><h2 id="iphone-17-pro-max">iPhone 17 Pro Max</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3438px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bi6PrNpRHCmk6W6nbvqbne" name="Z Fold 8 ultra video size shots-9" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/bi6PrNpRHCmk6W6nbvqbne-1920-80.jpg" mos="" align="middle" fullscreen="" width="3438" height="1934" attribution="" 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 ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Height (Inches)</strong></p></td><td  ><p><strong>Width (Inches)</strong></p></td><td  ><p><strong>Total (Sq Inch)</strong></p></td><td  ><p><strong>% Screen Used</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Screen (Landscape)</strong></p></td><td  ><p><strong>2.83</strong></p></td><td  ><p><strong>6.22</strong></p></td><td  ><p><strong>17.60</strong></p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>X-Men (YouTube)</strong></p></td><td  ><p>2.13</p></td><td  ><p>5.12</p></td><td  ><p>10.91</p></td><td  ><p>61.95</p></td></tr><tr><td class="firstcol " ><p><strong>X-Men-97 (D+)</strong></p></td><td  ><p>2.68</p></td><td  ><p>5.12</p></td><td  ><p>13.72</p></td><td  ><p>77.95</p></td></tr><tr><td class="firstcol " ><p><strong>The Emperor's New Groove (D+)</strong></p></td><td  ><p>2.83</p></td><td  ><p>4.76</p></td><td  ><p>13.47</p></td><td  ><p>76.53</p></td></tr><tr><td class="firstcol " ><p><strong>Scrubs (4:3/D+)</strong></p></td><td  ><p>2.83</p></td><td  ><p>3.82</p></td><td  ><p>10.81</p></td><td  ><p>61.41</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers: Endgame (Regular/D+)</strong></p></td><td  ><p>2.13</p></td><td  ><p>5.12</p></td><td  ><p>10.91</p></td><td  ><p>61.95</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers Endgame (IMAX/D+)</strong></p></td><td  ><p>2.68</p></td><td  ><p>5.12</p></td><td  ><p>13.72</p></td><td  ><p>77.95</p></td></tr><tr><td class="firstcol " ><p><strong>TikTok (Portrait)</strong></p></td><td  ><p>5.70</p></td><td  ><p>2.83</p></td><td  ><p>16.13</p></td><td  ><p>91.64</p></td></tr></tbody></table></div><p>The iPhone 17 Pro Max has roughly 17.6 square inches of screen space available, but it seems as though a bunch of the tested content struggles to fill up that space by default. The most efficient use of the screen comes from TikTok, which takes up 92.94% of the screen. This shouldn't be a huge surprise given the platform's vertical video feed that can take up almost the full length of the screen.</p><p>When it comes to horizontal video, the content doesn't fare nearly as well. The worst offender was "Scrubs," though this shouldn't really be a surprise since the early seasons were broadcast in the (then standard) 4:3 aspect ratio. That box-like shape isn't great at filling up wider-screen devices, reflected by the fact it only filled 61.41% of the available space.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="szKHqwyLGQvcjHp8cPTawe" name="Z Fold 8 ultra video size shots-2" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/szKHqwyLGQvcjHp8cPTawe-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Widescreen live action movies didn't do so well either. Both movies have been cropped vertically, and can't take full advantage of the landscape height, but they don't fail to take advantage of the iPhone's width and crop that way as well. In fact, all the movies suffered from this and left at least 1.1 inches of wasted space across both sides of the display. In the end, though, both movies wasted only slightly less space than "Scrubs" did, taking up 61.95% of the usable screen space</p><p>The IMAX edition of "Avengers: Endgame" fared a little better, with the IMAX scenes using up more of the vertical space that the standard aspect ratio. Because of this, the movie, along with the bizarrely proportioned "X-Men-97," used up 77.95% of the iPhone's available screen space. This was closely followed by the 16:9 "Emperor's New Groove," with 76.53%, a difference accounted for by a slightly shorter and narrower video.</p><h2 id="samsung-galaxy-z-fold-8-ultra-cover-display">Samsung Galaxy Z Fold 8 Ultra (Cover Display)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="S9uSv2YnCG5keeQwVsU4xe" name="Z Fold 8 ultra video size shots-3" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/S9uSv2YnCG5keeQwVsU4xe-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Height (Inches)</strong></p></td><td  ><p><strong>Width (Inches)</strong></p></td><td  ><p><strong>Total (Sq Inch)</strong></p></td><td  ><p><strong>% Screen Used</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Screen (Landscape)</strong></p></td><td  ><p><strong>2.56</strong></p></td><td  ><p><strong>5.94</strong></p></td><td  ><p><strong>15.21</strong></p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>X-Men (YouTube)</strong></p></td><td  ><p>1.77</p></td><td  ><p>4.57</p></td><td  ><p>8.09</p></td><td  ><p>53.19</p></td></tr><tr><td class="firstcol " ><p><strong>X-Men-97 (D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>5.94</p></td><td  ><p>15.21</p></td><td  ><p>100</p></td></tr><tr><td class="firstcol " ><p><strong>The Emperor's New Groove (D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>4.25</p></td><td  ><p>10.88</p></td><td  ><p>71.55</p></td></tr><tr><td class="firstcol " ><p><strong>Scrubs (4:3/D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>3.43</p></td><td  ><p>8.78</p></td><td  ><p>57.74</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers: Endgame (Regular/D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>5.94</p></td><td  ><p>15.21</p></td><td  ><p>100</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers Endgame (IMAX/D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>5.20</p></td><td  ><p>13.31</p></td><td  ><p>87.54</p></td></tr><tr><td class="firstcol " ><p><strong>TikTok (Portrait)</strong></p></td><td  ><p>4.57</p></td><td  ><p>2.56</p></td><td  ><p>11.70</p></td><td  ><p>76.94</p></td></tr></tbody></table></div><p>Looking at the results for the Z Fold 8 Ultra's cover display, and you'll see a couple of oddities. Both "X-Men 97" and the standard edition of "Avengers: Endgame" both took up 100% of the screen space. Which is certainly good, though this made me pause and wonder what's going on.</p><p>Checking the measurements of the cover display versus the iPhone 17 Pro Max, and I noticed that the video was actually smaller on the iPhone — despite the fact the 17 Pro Max has almost 2.5 extra square inches of available screen space.</p><p>Weirder still was the fact that my Google-purchased copy of "X-Men" was smaller than "Endgame," taking up a paltry 53.19% of the screen. They were both the same size on the iPhone, but the Z Fold 8 Ultra decided that the black bars must be preserved for this particular movie. This appears to be a YouTube issue, because X-Men on Disney Plus expanded to the full size of the display, just like Endgame did.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3121px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Jgg4hgUCgAxuobyisY5PTe" name="Z Fold 8 ultra video size shots-7" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/Jgg4hgUCgAxuobyisY5PTe-1920-80.jpg" mos="" align="middle" fullscreen="" width="3121" height="1756" attribution="" endorsement="" 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 IMAX version of Endgame obviously came out a little worse, since the taller image requires more space than the 8 Ultra's cover display allows — causing black bars at either side of the screen. That said, it still used up 87.54% of the available screen.</p><p>16:9 content like "The Emperor's New Groove" fared a lot worse here, though, since the narrow screen forced the video to shrink at the edges even more than an IMAX movie. Likewise the design meant "Scrubs" left a load more wasted space thanks to its square-ish aspect ratio. Both videos used up a respective 71.55% and 57.74% of the available screen space.</p><p>As for TikTok, this result did surprise me. The vertical videos used up all the available width when playing, but they didn't take full advantage of the screen length. Which again, I assume is down to the 8 Ultra's narrow cover display, and means TikTok only used 76.94% of the available screen space.</p><h2 id="samsung-galaxy-z-fold-8-ultra-foldable-display-portrait">Samsung Galaxy Z Fold 8 Ultra Foldable Display (Portrait)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3583px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="VdSKDACwu3ujopw3WSWnse" name="Z Fold 8 ultra video size shots-10" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/VdSKDACwu3ujopw3WSWnse-1920-80.jpg" mos="" align="middle" fullscreen="" width="3583" height="2015" attribution="" 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 ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Height (Inches)</strong></p></td><td  ><p><strong>Width (Inches)</strong></p></td><td  ><p><strong>Total (Sq Inch)</strong></p></td><td  ><p><strong>% Screen Used</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Screen</strong></p></td><td  ><p><strong>5.94</strong></p></td><td  ><p><strong>5.35</strong></p></td><td  ><p><strong>31.78</strong></p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>X-Men (YouTube)</strong></p></td><td  ><p>2.20</p></td><td  ><p>5.35</p></td><td  ><p>11.77</p></td><td  ><p>37.04</p></td></tr><tr><td class="firstcol " ><p><strong>X-Men-97 (D+)</strong></p></td><td  ><p>2.44</p></td><td  ><p>5.35</p></td><td  ><p>13.05</p></td><td  ><p>41.08</p></td></tr><tr><td class="firstcol " ><p><strong>The Emperor's New Groove (D+)</strong></p></td><td  ><p>2.99</p></td><td  ><p>5.03</p></td><td  ><p>15.04</p></td><td  ><p>47.33</p></td></tr><tr><td class="firstcol " ><p><strong>Scrubs (4:3/D+)</strong></p></td><td  ><p>4.01</p></td><td  ><p>5.35</p></td><td  ><p>21.45</p></td><td  ><p>67.51</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers: Endgame (Regular/D+)</strong></p></td><td  ><p>2.24</p></td><td  ><p>5.35</p></td><td  ><p>11.98</p></td><td  ><p>37.71</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers Endgame (IMAX/D+)</strong></p></td><td  ><p>2.99</p></td><td  ><p>5.35</p></td><td  ><p>16.00</p></td><td  ><p>50.34</p></td></tr><tr><td class="firstcol " ><p><strong>TikTok</strong></p></td><td  ><p>5.63</p></td><td  ><p>3.14</p></td><td  ><p>17.68</p></td><td  ><p>55.63</p></td></tr></tbody></table></div><p>The Z Fold 8 Ultra's larger display is the size of two cover displays side by side, which should mean a larger video to watch, right? Well, apparently not. At least not when the phone is in portrait mode. The size of the screen means there is a lot more wasted space, but the videos themselves aren't automatically bigger than they appear on the cover display either.</p><p>Both "X-Men-97" and the standard version of "Avengers: Endgame" ended up being smaller than their counterparts on the Ultra's cover display — in terms of height, width and overall area. Both used a respective 41.08% and 37.71% of the available screen space. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3915px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kti5xxYn8KnniYz2kdTNwe" name="Z Fold 8 ultra video size shots-6" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/kti5xxYn8KnniYz2kdTNwe-1920-80.jpg" mos="" align="middle" fullscreen="" width="3915" height="2202" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>That only worse performer was X-Men on YouTube, which used up 37.04% thanks to the way YouTube presents the video. That means almost two thirds of the screen is going unused. However, the video itself is larger than what I saw on the 8 Ultra's cover screen and the iPhone 17 Pro Max. So there is still a benefit to using the large screen. </p><p>There is an awful lot of wasted screen space watching in portrait mode. "The Emperor's New Groove" only used 47.33% of the screen, while the IMAX edition of "Endgame" took up just over half (50.34%). TikTok also suffered, using up 55.63% and showed off a video that was both shorter and wider than the one from the iPhone.</p><p>The major winner here is "Scrubs," thanks to the aspect ratio, which means it took up 67.51% of the screen and offered a much larger overall image than we've seen from it so far.</p><h2 id="samsung-galaxy-z-fold-8-ultra-foldable-display-landscape">Samsung Galaxy Z Fold 8 Ultra Foldable Display (Landscape)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3527px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MGCMuUBSp4HjqTYptkefge" name="Z Fold 8 ultra video size shots-5" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/MGCMuUBSp4HjqTYptkefge-1920-80.jpg" mos="" align="middle" fullscreen="" width="3527" height="1984" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The key benefit to watching video in landscape mode is that the entirety of the display crease gets covered up by whatever you're watching, which makes it nearly impossible to see. The other main advantage to watching video this way is that the videos are larger (and less wasteful) than in portrait mode</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Height (Inches)</strong></p></td><td  ><p><strong>Width (Inches)</strong></p></td><td  ><p><strong>Total (Sq Inch)</strong></p></td><td  ><p><strong>% Screen Used</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Screen</strong></p></td><td  ><p><strong>5.35</strong></p></td><td  ><p><strong>5.94</strong></p></td><td  ><p><strong>31.78</strong></p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>X-Men (YouTube)</strong></p></td><td  ><p>2.48</p></td><td  ><p>5.94</p></td><td  ><p>14.73</p></td><td  ><p>46.36</p></td></tr><tr><td class="firstcol " ><p><strong>X-Men-97 (D+)</strong></p></td><td  ><p>2.68</p></td><td  ><p>5.94</p></td><td  ><p>15.92</p></td><td  ><p>50.09</p></td></tr><tr><td class="firstcol " ><p><strong>The Emperor's New Groove (D+)</strong></p></td><td  ><p>3.34</p></td><td  ><p>5.55</p></td><td  ><p>18.54</p></td><td  ><p>58.33</p></td></tr><tr><td class="firstcol " ><p><strong>Scrubs (4:3/D+)</strong></p></td><td  ><p>4.48</p></td><td  ><p>5.94</p></td><td  ><p>26.61</p></td><td  ><p>83.74</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers: Endgame (Regular/D+)</strong></p></td><td  ><p>2.48</p></td><td  ><p>5.94</p></td><td  ><p>14.73</p></td><td  ><p>46.36</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers Endgame (IMAX/D+)</strong></p></td><td  ><p>3.15</p></td><td  ><p>5.94</p></td><td  ><p>18.71</p></td><td  ><p>58.88</p></td></tr><tr><td class="firstcol " ><p><strong>TikTok </strong></p></td><td  ><p>5.00</p></td><td  ><p>2.83</p></td><td  ><p>14.15</p></td><td  ><p>44.53</p></td></tr></tbody></table></div><p>The biggest winner is again, "Scrubs," or any other older TV show that was filmed with a 4:3 aspect ratio. The show took up 83.74% of the total screen space, over 16% more than it did in portrait mode. This obviously means that the video is noticeably larger, though the standard definition image does not look great if you're getting up close with the screen.</p><p>Most of the other videos take full advantage of the extra width, with the only exception being "The Emperor's New Groove," which is about 0.4-inches narrower. However the extra height afforded to  16:9 movie means it uses up 58.33% of the screen, compared to the 46.46% utilized by X-Men and the standard version of "Avengers: Endgame."</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3604px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="X2djLcD7k7Z3wXX62M8fxe" name="Z Fold 8 ultra video size shots-8" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/X2djLcD7k7Z3wXX62M8fxe-1920-80.jpg" mos="" align="middle" fullscreen="" width="3604" height="2027" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>"X-Men-97" is 0.2-inches taller in this configuration, meaning its total raises to 50.09%, while the IMAX enhanced edition of "Endgame" fills up 58.88% on account of its extra height.</p><p>The only real loser here is TikTok, which is shorter and narrower in landscape mode, and wastes an extra 11% of the screen compared to portrait mode. That also makes sense, since this orientation is wider than it is long, and that means the vertical videos get squashed down compared to viewing in portrait mode.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WnnvjW"></div>                            </div>                            <script src="https://kwizly.com/embed/WnnvjW.js" async></script><h2 id="verdict">Verdict</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="k8FeDxnevUPmLReuywiMxe" name="Z Fold 8 ultra video size shots-4" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/k8FeDxnevUPmLReuywiMxe-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>With the exception of TikTok, landscape mode actually seems to have the largest overall video size of all four display configurations, barring one. The way "Avengers: Endgame" is presented on the cover display means it is slightly taller on the outer screen, by one tenth of an inch. </p><p>The cover display's aspect ratio means it seems to be uniquely suited to playing live action theatrical releases. Assuming the service you're using actually makes the most of the space, and doesn't do what YouTube did with my copy of X-Men and squashes the whole thing down for no reason.</p><p>As for TikTok, it's clear that the Z Fold 8 Ultra's foldable display is not as well-suited to vertical video as non-folding screens. Likewise, those of you that are bothered about black areas of screen around your video, you may want to avoid foldables for the time being. If you need a larger image to watch, you should probably invest in some kind of tablet. </p><p>But now the one question I have is this: How different would the results have been if I'd had a <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> to compare everything to? Samsung has positioned the passport-shaped device as the ideal device for streaming and media after all, but that face-off is going to have to wait.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-used-a-thermal-camera-to-see-how-hot-the-galaxy-z-fold-8-ultra-gets-compared-to-the-galaxy-s26-ultra-heres-what-happened">I used a thermal camera to see how hot the Galaxy Z Fold 8 Ultra gets compared to the Galaxy S26 Ultra — here's what happened</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra">I tested the Samsung Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra for 2 weeks — here’s the one I’d buy</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">I just tried the new Samsung DeX on the Galaxy Z Fold 8 — and it has one huge upgrade</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/does-the-galaxy-z-fold-8-ultra-make-the-most-use-of-its-screen-space-i-streamed-a-bunch-of-movies-and-tv-shows-to-find-out</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Z fold 8 Ultra has a big screen, but it's also an odd shape — so how does that affect video streaming? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">JGSy6tUvmFMSt7C5U4Piqe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/wVDkztfBTjGtEfwDR2dfxe-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 09 Aug 2026 10:45:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/wVDkztfBTjGtEfwDR2dfxe-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max]]></media:description>                                                            <media:text><![CDATA[samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max]]></media:text>
                                <media:title type="plain"><![CDATA[samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/wVDkztfBTjGtEfwDR2dfxe-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When it comes to streaming movies and TV shows, a larger screen is usually considered the better option. But, that only really works if the screen shape actually conforms to the aspect ratio of the content in question. That's not an issue for most phones or tablet screens, but what about the larger, oddly-shaped foldable displays like the one on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Samsung Galaxy Z Fold 8 Ultra</a>?</p><p>I've been testing the Z Fold 8 Ultra for the past few weeks, and it shouldn't surprise anyone that watching video on the larger display means I also have to contend with large areas of blank space around the video. This can be rather irritating, especially in brighter environments that highlight both the display crease and my own reflection.</p><div class="product"><a data-dimension112="13ad7924-9271-11f1-a833-6bcbee429b16" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2098" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="13ad7924-9271-11f1-a833-6bcbee429b16" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2098">Galaxy Z Fold 8 Ultra: $2098</a></strong><br>The price may have gone up (again), there are are still plenty of reasons to pick up the Z Fold 8 Ultra. There's a large 8-inch foldable display hiding away, alongside a 6.5-inch cover display, trio of main cameras (with a 200MP main lens), powerful performance and excellent battery life.</p><p>Amazon is currently giving away a $350 gift card with each purchase too.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J" target="_blank" rel="nofollow" data-dimension112="13ad7924-9271-11f1-a833-6bcbee429b16" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2098">View Deal</a></p></div><p>But as many people will no doubt point out, there are multiple ways to watch videos on the Galaxy Z Fold 8 Ultra. There's the cover display which, while narrower than most phones, offers a traditional viewing experience. The foldable display can also be oriented in portrait or landscape modes, and switching between the two flips the aspect ratio. </p><p>While this may not seem like a big deal, the Z Fold 8 Ultra isn't a perfect square, and that means the flip also changes how video content sits on your phone. But which mode is the better way to watch stuff? I tested the Z Fold 8 Ultra's three viewing experiences against the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> to find out.</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/oFT-YOrakEg" allowfullscreen></iframe></div></div><h2 id="how-i-tested-the-screens">How I tested the screens</h2><p>It's easy to load up some content on a screen and rely on vibes alone to make your conclusion, but I took things a step further by actively measuring everything on screen. This started with the screen itself, measuring between the bezels and calculating the amount of screen space that is actually available.</p><p>I should caveat at this point that this is only a rough calculation, because all four phones have curved corners. This is less of an issue on the Z Fold 8 Ultra because those curves are very slight. However the iPhone 17 Pro Max's corners are larger and more rounded, which means the total screen area is slightly smaller than the math suggests.</p><p>Once the total area of each display was calculated, I got to work streaming, throwing up a bunch of different kinds of content and measuring how much screen space they took up. Content included:</p><ul><li>"X-Men (2000)" (2:39:1) purchased on YouTube</li><li>"X-Men-97" (2:35:1)  on Disney Plus</li><li>"The Emperor's New Groove" (16:9) on Disney Plus</li><li>"Scrubs" (2001) (4:3) on Disney Plus</li><li>"Avengers: Endgame" (2:39:1) on Disney Plus</li><li>"Avengers: Endgame IMAX Enhanced Edition" (1:9:1) on Disney Plus</li><li>Various vertical videos on TikTok</li></ul><p>I set up each video playing on the four screen types, then measured how large each video was. With that in hand, I was able to work out just how much screen space they actually used, and thus, how much space is just sitting there going to waste. Crucially, this means I can figure out the best option for watching content in something close to a full-screen experience.</p><p>I should also note that while a lot of streaming platforms offer a "zoom to fill" option on smart phones and tablets, I have not taken this into account since that essentially crops the video and means you don't see everything that's going on.</p><h2 id="iphone-17-pro-max">iPhone 17 Pro Max</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3438px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bi6PrNpRHCmk6W6nbvqbne" name="Z Fold 8 ultra video size shots-9" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/bi6PrNpRHCmk6W6nbvqbne-1920-80.jpg" mos="" align="middle" fullscreen="" width="3438" height="1934" attribution="" 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 ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Height (Inches)</strong></p></td><td  ><p><strong>Width (Inches)</strong></p></td><td  ><p><strong>Total (Sq Inch)</strong></p></td><td  ><p><strong>% Screen Used</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Screen (Landscape)</strong></p></td><td  ><p><strong>2.83</strong></p></td><td  ><p><strong>6.22</strong></p></td><td  ><p><strong>17.60</strong></p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>X-Men (YouTube)</strong></p></td><td  ><p>2.13</p></td><td  ><p>5.12</p></td><td  ><p>10.91</p></td><td  ><p>61.95</p></td></tr><tr><td class="firstcol " ><p><strong>X-Men-97 (D+)</strong></p></td><td  ><p>2.68</p></td><td  ><p>5.12</p></td><td  ><p>13.72</p></td><td  ><p>77.95</p></td></tr><tr><td class="firstcol " ><p><strong>The Emperor's New Groove (D+)</strong></p></td><td  ><p>2.83</p></td><td  ><p>4.76</p></td><td  ><p>13.47</p></td><td  ><p>76.53</p></td></tr><tr><td class="firstcol " ><p><strong>Scrubs (4:3/D+)</strong></p></td><td  ><p>2.83</p></td><td  ><p>3.82</p></td><td  ><p>10.81</p></td><td  ><p>61.41</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers: Endgame (Regular/D+)</strong></p></td><td  ><p>2.13</p></td><td  ><p>5.12</p></td><td  ><p>10.91</p></td><td  ><p>61.95</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers Endgame (IMAX/D+)</strong></p></td><td  ><p>2.68</p></td><td  ><p>5.12</p></td><td  ><p>13.72</p></td><td  ><p>77.95</p></td></tr><tr><td class="firstcol " ><p><strong>TikTok (Portrait)</strong></p></td><td  ><p>5.70</p></td><td  ><p>2.83</p></td><td  ><p>16.13</p></td><td  ><p>91.64</p></td></tr></tbody></table></div><p>The iPhone 17 Pro Max has roughly 17.6 square inches of screen space available, but it seems as though a bunch of the tested content struggles to fill up that space by default. The most efficient use of the screen comes from TikTok, which takes up 92.94% of the screen. This shouldn't be a huge surprise given the platform's vertical video feed that can take up almost the full length of the screen.</p><p>When it comes to horizontal video, the content doesn't fare nearly as well. The worst offender was "Scrubs," though this shouldn't really be a surprise since the early seasons were broadcast in the (then standard) 4:3 aspect ratio. That box-like shape isn't great at filling up wider-screen devices, reflected by the fact it only filled 61.41% of the available space.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="szKHqwyLGQvcjHp8cPTawe" name="Z Fold 8 ultra video size shots-2" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/szKHqwyLGQvcjHp8cPTawe-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Widescreen live action movies didn't do so well either. Both movies have been cropped vertically, and can't take full advantage of the landscape height, but they don't fail to take advantage of the iPhone's width and crop that way as well. In fact, all the movies suffered from this and left at least 1.1 inches of wasted space across both sides of the display. In the end, though, both movies wasted only slightly less space than "Scrubs" did, taking up 61.95% of the usable screen space</p><p>The IMAX edition of "Avengers: Endgame" fared a little better, with the IMAX scenes using up more of the vertical space that the standard aspect ratio. Because of this, the movie, along with the bizarrely proportioned "X-Men-97," used up 77.95% of the iPhone's available screen space. This was closely followed by the 16:9 "Emperor's New Groove," with 76.53%, a difference accounted for by a slightly shorter and narrower video.</p><h2 id="samsung-galaxy-z-fold-8-ultra-cover-display">Samsung Galaxy Z Fold 8 Ultra (Cover Display)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="S9uSv2YnCG5keeQwVsU4xe" name="Z Fold 8 ultra video size shots-3" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/S9uSv2YnCG5keeQwVsU4xe-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Height (Inches)</strong></p></td><td  ><p><strong>Width (Inches)</strong></p></td><td  ><p><strong>Total (Sq Inch)</strong></p></td><td  ><p><strong>% Screen Used</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Screen (Landscape)</strong></p></td><td  ><p><strong>2.56</strong></p></td><td  ><p><strong>5.94</strong></p></td><td  ><p><strong>15.21</strong></p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>X-Men (YouTube)</strong></p></td><td  ><p>1.77</p></td><td  ><p>4.57</p></td><td  ><p>8.09</p></td><td  ><p>53.19</p></td></tr><tr><td class="firstcol " ><p><strong>X-Men-97 (D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>5.94</p></td><td  ><p>15.21</p></td><td  ><p>100</p></td></tr><tr><td class="firstcol " ><p><strong>The Emperor's New Groove (D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>4.25</p></td><td  ><p>10.88</p></td><td  ><p>71.55</p></td></tr><tr><td class="firstcol " ><p><strong>Scrubs (4:3/D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>3.43</p></td><td  ><p>8.78</p></td><td  ><p>57.74</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers: Endgame (Regular/D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>5.94</p></td><td  ><p>15.21</p></td><td  ><p>100</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers Endgame (IMAX/D+)</strong></p></td><td  ><p>2.56</p></td><td  ><p>5.20</p></td><td  ><p>13.31</p></td><td  ><p>87.54</p></td></tr><tr><td class="firstcol " ><p><strong>TikTok (Portrait)</strong></p></td><td  ><p>4.57</p></td><td  ><p>2.56</p></td><td  ><p>11.70</p></td><td  ><p>76.94</p></td></tr></tbody></table></div><p>Looking at the results for the Z Fold 8 Ultra's cover display, and you'll see a couple of oddities. Both "X-Men 97" and the standard edition of "Avengers: Endgame" both took up 100% of the screen space. Which is certainly good, though this made me pause and wonder what's going on.</p><p>Checking the measurements of the cover display versus the iPhone 17 Pro Max, and I noticed that the video was actually smaller on the iPhone — despite the fact the 17 Pro Max has almost 2.5 extra square inches of available screen space.</p><p>Weirder still was the fact that my Google-purchased copy of "X-Men" was smaller than "Endgame," taking up a paltry 53.19% of the screen. They were both the same size on the iPhone, but the Z Fold 8 Ultra decided that the black bars must be preserved for this particular movie. This appears to be a YouTube issue, because X-Men on Disney Plus expanded to the full size of the display, just like Endgame did.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3121px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Jgg4hgUCgAxuobyisY5PTe" name="Z Fold 8 ultra video size shots-7" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/Jgg4hgUCgAxuobyisY5PTe-1920-80.jpg" mos="" align="middle" fullscreen="" width="3121" height="1756" attribution="" endorsement="" 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 IMAX version of Endgame obviously came out a little worse, since the taller image requires more space than the 8 Ultra's cover display allows — causing black bars at either side of the screen. That said, it still used up 87.54% of the available screen.</p><p>16:9 content like "The Emperor's New Groove" fared a lot worse here, though, since the narrow screen forced the video to shrink at the edges even more than an IMAX movie. Likewise the design meant "Scrubs" left a load more wasted space thanks to its square-ish aspect ratio. Both videos used up a respective 71.55% and 57.74% of the available screen space.</p><p>As for TikTok, this result did surprise me. The vertical videos used up all the available width when playing, but they didn't take full advantage of the screen length. Which again, I assume is down to the 8 Ultra's narrow cover display, and means TikTok only used 76.94% of the available screen space.</p><h2 id="samsung-galaxy-z-fold-8-ultra-foldable-display-portrait">Samsung Galaxy Z Fold 8 Ultra Foldable Display (Portrait)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3583px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="VdSKDACwu3ujopw3WSWnse" name="Z Fold 8 ultra video size shots-10" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/VdSKDACwu3ujopw3WSWnse-1920-80.jpg" mos="" align="middle" fullscreen="" width="3583" height="2015" attribution="" 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 ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Height (Inches)</strong></p></td><td  ><p><strong>Width (Inches)</strong></p></td><td  ><p><strong>Total (Sq Inch)</strong></p></td><td  ><p><strong>% Screen Used</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Screen</strong></p></td><td  ><p><strong>5.94</strong></p></td><td  ><p><strong>5.35</strong></p></td><td  ><p><strong>31.78</strong></p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>X-Men (YouTube)</strong></p></td><td  ><p>2.20</p></td><td  ><p>5.35</p></td><td  ><p>11.77</p></td><td  ><p>37.04</p></td></tr><tr><td class="firstcol " ><p><strong>X-Men-97 (D+)</strong></p></td><td  ><p>2.44</p></td><td  ><p>5.35</p></td><td  ><p>13.05</p></td><td  ><p>41.08</p></td></tr><tr><td class="firstcol " ><p><strong>The Emperor's New Groove (D+)</strong></p></td><td  ><p>2.99</p></td><td  ><p>5.03</p></td><td  ><p>15.04</p></td><td  ><p>47.33</p></td></tr><tr><td class="firstcol " ><p><strong>Scrubs (4:3/D+)</strong></p></td><td  ><p>4.01</p></td><td  ><p>5.35</p></td><td  ><p>21.45</p></td><td  ><p>67.51</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers: Endgame (Regular/D+)</strong></p></td><td  ><p>2.24</p></td><td  ><p>5.35</p></td><td  ><p>11.98</p></td><td  ><p>37.71</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers Endgame (IMAX/D+)</strong></p></td><td  ><p>2.99</p></td><td  ><p>5.35</p></td><td  ><p>16.00</p></td><td  ><p>50.34</p></td></tr><tr><td class="firstcol " ><p><strong>TikTok</strong></p></td><td  ><p>5.63</p></td><td  ><p>3.14</p></td><td  ><p>17.68</p></td><td  ><p>55.63</p></td></tr></tbody></table></div><p>The Z Fold 8 Ultra's larger display is the size of two cover displays side by side, which should mean a larger video to watch, right? Well, apparently not. At least not when the phone is in portrait mode. The size of the screen means there is a lot more wasted space, but the videos themselves aren't automatically bigger than they appear on the cover display either.</p><p>Both "X-Men-97" and the standard version of "Avengers: Endgame" ended up being smaller than their counterparts on the Ultra's cover display — in terms of height, width and overall area. Both used a respective 41.08% and 37.71% of the available screen space. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3915px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kti5xxYn8KnniYz2kdTNwe" name="Z Fold 8 ultra video size shots-6" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/kti5xxYn8KnniYz2kdTNwe-1920-80.jpg" mos="" align="middle" fullscreen="" width="3915" height="2202" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>That only worse performer was X-Men on YouTube, which used up 37.04% thanks to the way YouTube presents the video. That means almost two thirds of the screen is going unused. However, the video itself is larger than what I saw on the 8 Ultra's cover screen and the iPhone 17 Pro Max. So there is still a benefit to using the large screen. </p><p>There is an awful lot of wasted screen space watching in portrait mode. "The Emperor's New Groove" only used 47.33% of the screen, while the IMAX edition of "Endgame" took up just over half (50.34%). TikTok also suffered, using up 55.63% and showed off a video that was both shorter and wider than the one from the iPhone.</p><p>The major winner here is "Scrubs," thanks to the aspect ratio, which means it took up 67.51% of the screen and offered a much larger overall image than we've seen from it so far.</p><h2 id="samsung-galaxy-z-fold-8-ultra-foldable-display-landscape">Samsung Galaxy Z Fold 8 Ultra Foldable Display (Landscape)</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3527px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MGCMuUBSp4HjqTYptkefge" name="Z Fold 8 ultra video size shots-5" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/MGCMuUBSp4HjqTYptkefge-1920-80.jpg" mos="" align="middle" fullscreen="" width="3527" height="1984" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The key benefit to watching video in landscape mode is that the entirety of the display crease gets covered up by whatever you're watching, which makes it nearly impossible to see. The other main advantage to watching video this way is that the videos are larger (and less wasteful) than in portrait mode</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Height (Inches)</strong></p></td><td  ><p><strong>Width (Inches)</strong></p></td><td  ><p><strong>Total (Sq Inch)</strong></p></td><td  ><p><strong>% Screen Used</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Screen</strong></p></td><td  ><p><strong>5.35</strong></p></td><td  ><p><strong>5.94</strong></p></td><td  ><p><strong>31.78</strong></p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>X-Men (YouTube)</strong></p></td><td  ><p>2.48</p></td><td  ><p>5.94</p></td><td  ><p>14.73</p></td><td  ><p>46.36</p></td></tr><tr><td class="firstcol " ><p><strong>X-Men-97 (D+)</strong></p></td><td  ><p>2.68</p></td><td  ><p>5.94</p></td><td  ><p>15.92</p></td><td  ><p>50.09</p></td></tr><tr><td class="firstcol " ><p><strong>The Emperor's New Groove (D+)</strong></p></td><td  ><p>3.34</p></td><td  ><p>5.55</p></td><td  ><p>18.54</p></td><td  ><p>58.33</p></td></tr><tr><td class="firstcol " ><p><strong>Scrubs (4:3/D+)</strong></p></td><td  ><p>4.48</p></td><td  ><p>5.94</p></td><td  ><p>26.61</p></td><td  ><p>83.74</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers: Endgame (Regular/D+)</strong></p></td><td  ><p>2.48</p></td><td  ><p>5.94</p></td><td  ><p>14.73</p></td><td  ><p>46.36</p></td></tr><tr><td class="firstcol " ><p><strong>Avengers Endgame (IMAX/D+)</strong></p></td><td  ><p>3.15</p></td><td  ><p>5.94</p></td><td  ><p>18.71</p></td><td  ><p>58.88</p></td></tr><tr><td class="firstcol " ><p><strong>TikTok </strong></p></td><td  ><p>5.00</p></td><td  ><p>2.83</p></td><td  ><p>14.15</p></td><td  ><p>44.53</p></td></tr></tbody></table></div><p>The biggest winner is again, "Scrubs," or any other older TV show that was filmed with a 4:3 aspect ratio. The show took up 83.74% of the total screen space, over 16% more than it did in portrait mode. This obviously means that the video is noticeably larger, though the standard definition image does not look great if you're getting up close with the screen.</p><p>Most of the other videos take full advantage of the extra width, with the only exception being "The Emperor's New Groove," which is about 0.4-inches narrower. However the extra height afforded to  16:9 movie means it uses up 58.33% of the screen, compared to the 46.46% utilized by X-Men and the standard version of "Avengers: Endgame."</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3604px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="X2djLcD7k7Z3wXX62M8fxe" name="Z Fold 8 ultra video size shots-8" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/X2djLcD7k7Z3wXX62M8fxe-1920-80.jpg" mos="" align="middle" fullscreen="" width="3604" height="2027" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>"X-Men-97" is 0.2-inches taller in this configuration, meaning its total raises to 50.09%, while the IMAX enhanced edition of "Endgame" fills up 58.88% on account of its extra height.</p><p>The only real loser here is TikTok, which is shorter and narrower in landscape mode, and wastes an extra 11% of the screen compared to portrait mode. That also makes sense, since this orientation is wider than it is long, and that means the vertical videos get squashed down compared to viewing in portrait mode.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WnnvjW"></div>                            </div>                            <script src="https://kwizly.com/embed/WnnvjW.js" async></script><h2 id="verdict">Verdict</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="k8FeDxnevUPmLReuywiMxe" name="Z Fold 8 ultra video size shots-4" alt="samsung galaxy z fold 8 ultra screen size comparison vs iphone 17 pro max" src="https://cdn.mos.cms.futurecdn.net/k8FeDxnevUPmLReuywiMxe-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>With the exception of TikTok, landscape mode actually seems to have the largest overall video size of all four display configurations, barring one. The way "Avengers: Endgame" is presented on the cover display means it is slightly taller on the outer screen, by one tenth of an inch. </p><p>The cover display's aspect ratio means it seems to be uniquely suited to playing live action theatrical releases. Assuming the service you're using actually makes the most of the space, and doesn't do what YouTube did with my copy of X-Men and squashes the whole thing down for no reason.</p><p>As for TikTok, it's clear that the Z Fold 8 Ultra's foldable display is not as well-suited to vertical video as non-folding screens. Likewise, those of you that are bothered about black areas of screen around your video, you may want to avoid foldables for the time being. If you need a larger image to watch, you should probably invest in some kind of tablet. </p><p>But now the one question I have is this: How different would the results have been if I'd had a <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> to compare everything to? Samsung has positioned the passport-shaped device as the ideal device for streaming and media after all, but that face-off is going to have to wait.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-used-a-thermal-camera-to-see-how-hot-the-galaxy-z-fold-8-ultra-gets-compared-to-the-galaxy-s26-ultra-heres-what-happened">I used a thermal camera to see how hot the Galaxy Z Fold 8 Ultra gets compared to the Galaxy S26 Ultra — here's what happened</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra">I tested the Samsung Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra for 2 weeks — here’s the one I’d buy</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">I just tried the new Samsung DeX on the Galaxy Z Fold 8 — and it has one huge upgrade</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ How ‘Ultra’ are the Galaxy Z Fold 8 Ultra's cameras? I put them to the test against the Galaxy S26 Ultra ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung’s been making its “Ultra” phones for years under the Galaxy S banner, but this year marks the first time the title is being used for a foldable phone. Needless to say, Samsung is trying to change the narrative with the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a> — by slapping its premier "Ultra" badge on a foldable for the very first time.</p><p>On paper, it packs the flagship hardware specs that I know appeal to hardcore fans who’ve remained faithful to the Galaxy S line for years, including the same 200MP main sensor as the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>. But when you’re paying a massive premium for a phone that folds, the cameras can’t come up short against the traditional slab flagship.</p><p>There are valid reasons why Samsung’s primary flagship remains the <a href="https://www.tomsguide.com/us/best-phone-cameras,review-2272.html">best camera phone</a> around, armed with a quadruple camera setup that includes two telephoto lenses — whereas the Z Fold 8 Ultra comes with just a single telephoto lens with a shorter optical range. To see if Samsung’s newest foldable genuinely earns its name, I captured side-by-side photo sets with both the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra">Galaxy Z Fold 8 Ultra and the Galaxy S26 Ultra</a>. Here’s what I found.</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-camera-specifications"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Camera specifications</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p><strong>Galaxy S26 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Main Camera</strong></p></td><td  ><p>200MP (f/1.7)</p></td><td  ><p>200MP (f/1.4)</p></td></tr><tr><td class="firstcol " ><p><strong>Ultrawide Camera</strong></p></td><td  ><p>50MP (f/1.9)</p></td><td  ><p>50MP (f/1.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Telephoto Cameras</strong></p></td><td  ><p>• 10MP 3x telephoto (f/2.4)</p></td><td  ><p>• 10MP 3x telephoto (f/2.4)</p><p>• 50MP 5x telephoto (f/2.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Zoom Range</strong></p></td><td  ><p>Up to 30x Space Zoom</p></td><td  ><p>Up to 100x Space Zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Cameras</strong></p></td><td  ><p>10MP Cover Screen (f/2.2) + 10 MP Inner Display (f/2.2)</p></td><td  ><p>12MP (f2.2)</p></td></tr></tbody></table></div><p>What’s really fascinating when looking at the specs alone is that the cameras are not entirely identical. Despite both devices sharing a 200MP resolution for their main sensors and a 50MP (f/1.9) ultrawide camera, the Galaxy S26 Ultra technically holds an edge in optical range and low-light capabilities.</p><p>For starters, the S26 Ultra features a wider f/1.4 aperture compared to the Z Fold 8 Ultra’s f/1.7, allowing more light to enter the sensor — which should result in better low-light performance, less noise, and blur-free action shots.</p><p>Over in the telephoto department, the S26 Ultra also benefits from dual telephoto lenses, complete with a superior 50MP sensor featuring 5x optical zoom. In contrast, the newer Z Fold 8 Ultra relies on just a single 10MP telephoto camera with a shorter 3x optical zoom. These specs alone tell me there’s no way the Z Fold 8 Ultra is going to match the S26 Ultra in sheer telephoto performance.</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-200mp-high-resolution"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: 200MP high resolution</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/cvvbtvqXhuKNV5PsiYQDfF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/8rSb7RZZHv5rRpcnryAM5d-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Future</small></figcaption></figure></figure><p>These first two shots illustrate the amount of detail captured when set to their maximum 200MP photo option. Not only do both produce massive file sizes, but the differences between them appear minimal at first glance. Looking at the full scene, it’s great that both phones balance the exposure evenly, though the S26 Ultra is slightly brighter in the shadows.</p><p>Zooming in, however, reveals that the Z Fold 8 Ultra retains sharper details and definition almost everywhere. From the base of the tree to the ornate floral arrangement hanging over the terrace in the background, I’d give this round to the Z Fold 8 Ultra.</p><p><strong>Winner:</strong> Galaxy Z Fold 8 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-colors"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Colors</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/BKQv5NjgvAqWQGAzbbDNsi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Tbcsv6heCjtKjWPzdCbZsi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Judging by color performance alone, both phones deliver vibrant shots of the flower arrangement inside Whole Foods.</p><p>While the S26 Ultra has a penchant for a warmer color temperature — evident in how the pink flowers take on a slightly orange tone — the Z Fold 8 Ultra’s shot isn’t too far off, albeit not quite as warm. Still, neither phone clearly outperforms the other when it comes to color rendering here.</p><p><strong>Winner:</strong> tie</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-ultrawide"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Ultrawide</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/bawxTFUiEstaXNAb2AR6hF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/rNrVsvsoJRZYHsByiKvHoV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Given that both phones share identical 50MP (f/1.9) ultrawide cameras, I’m not surprised that this wide shot of Bryant Park is almost too close to call. Both devices capture impressive sharpness across the frame with minimal distortion around the edges.</p><p>However, looking closely at the lighting dynamics, the Galaxy S26 Ultra handles exposure and shadows slightly better — a trend I previously noted in the 200MP test. Notice how the people seated in the foreground have better visibility and contrast on the S26 Ultra, whereas the Z Fold 8 Ultra pulls a bit more shadow detail at the expense of a somewhat flatter tone.</p><p>Once again, it's a narrow victory, but the S26 Ultra takes it thanks to its superior dynamic range.</p><p><strong>Winner: </strong>Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-dynamic-range"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Dynamic Range</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/bDSoaB6YXxuXKoTqHU3TfF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/MmwGZtHYFfdU4SzBWyJnmV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>With the sun coming from behind, the background and sky are much brighter than the metal statue sitting in the shadow — a setup that clearly reveals how their dynamic range performances differ.</p><p>I’m initially drawn to the Galaxy Z Fold 8 Ultra’s punchier overall shot, which is largely due to how it boosts contrast. Doing so, however, comes at the expense of the highlights in the trees and the glass building in the background.</p><p>On the other hand, the Galaxy S26 Ultra exhibits superior dynamic range. It manages to tone down the harsh highlights on the metal statue while pulling up subtle details in the darker foliage and shadowed steps along the bottom left. Ultimately, the S26 Ultra achieves a more balanced, natural exposure without blowing out the brightest areas or over-darkening the shadows.</p><p><strong>Winner: </strong>Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-portrait"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Portrait</span></h2><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=b187e00e-91d0-11f1-ba1b-0e6f42328d7d"></iframe><p>At first glance, I don’t notice a whole lot of difference in the way they approach portrait shots, as both apply just the right amount of bokeh to blur the background while preserving clean edge separation around my colleague, <a href="https://www.tomsguide.com/author/mark-spoonauer">Mark Spoonauer</a>.</p><p>The Galaxy Z Fold 8 Ultra produces a natural skin tone and plenty of fine detail across Mark’s face and shirt. However, closer inspection reveals that there are sharper details captured by the Galaxy S26 Ultra’s portrait shot. Most noticeably, the fabric of his shirt and the stitching around his pocket show superior definition.</p><p><strong>Winner:</strong> Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-selfie"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Selfie</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/e8xVg6WGnZz9BPZSEvcrni-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - Front camera<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2jRFCRn8ANYoQ8b5WJRcoi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>The S26 Ultra has a slight advantage on paper for taking selfies thanks to its 12MP front camera. The Z Fold 8 Ultra features dual 10MP selfie shooters, but for this test, I’m specifically comparing the cover screen camera.</p><p>It’s a very close call, though, with neither phone clearly outperforming the other. I really like the amount of sharp detail both capture across Mark’s face, as well as the texture of his shirt. Meanwhile, both devices manage to lift the exposure nicely in the shaded areas in the background.</p><p><strong>Winner:</strong> tie</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-low-light"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Low light</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/3uREWtvkGoHw9vP6mPBsGF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/nvYuSJhn6iiHxBXuiJCEcV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>When shooting in dimly lit conditions, the main sensor aperture specs show their real-world impact. The Galaxy S26 Ultra’s wider f/1.4 aperture pulls in significantly more light than the Z Fold 8 Ultra’s f/1.7 lens, creating a slightly brighter scene overall.</p><p>Looking at the backyard patio shot, the Galaxy S26 Ultra does a much better job illuminating the white fence in the background, the lawn, and the texture of the patio pavers.</p><p>Don’t get me wrong, the Galaxy Z Fold 8 Ultra still produces an excellent low-light photo that brightens an otherwise dark scene, but those same background areas remain darker and cast heavier shadows around the base of the chairs and side table. Thanks to its wider aperture, the S26 Ultra also retains cleaner details across the patio furniture without introducing excessive noise.</p><p><strong>Winner: </strong>Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-telephoto"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Telephoto</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/j6MuaLqukbwjyN32Z4TfZF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/CEqvfgE3Etv4t8D7jWbPiV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/fVsU3F4aDfFac9ZQGj9wMF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/WUWwCqzw5XMCMJbtVZGhgV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/dpLtDThSHF5E4Qfuxs8ZGF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xTwrPNttz9jRWzYW7cn5cV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Where I find the most substantial difference between them is in their telephoto performance. At shorter distances, they deliver nearly identical results, but the shots above of the ice cream truck show how the Galaxy S26 Ultra offers true Ultra-level performance.</p><p>Comparing them across 5x, 10x, and 30x zoom levels highlights the clear advantage of the Galaxy S26 Ultra’s setup. At 5x zoom, both phones capture solid shots of the ice cream truck menu, but the S26 Ultra renders crisper text across the menu labels with less digital noise.</p><p>The divide widens significantly at 10x: the S26 Ultra retains sharp edges, vibrant contrast, and legible text on the menu options. To capture the same framing, the Z Fold 8 Ultra relies on digital cropping from its single 10MP 3x telephoto lens, leaving the 10x image noticeably softer with smoother, watercolor-like textures.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=3ddb19aa-91d0-11f1-ba1b-0e6f42328d7d"></iframe><p>Finally, at 30x zoom, the S26 Ultra’s superior optical hardware gives its image processing far better detail to work with. The text labels under each ice cream cone remain surprisingly readable, whereas the Z Fold 8 Ultra’s 30x crop produces blurred text and blob-like details.</p><p><strong>Winner: </strong>Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-verdict"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: 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:3506px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="A6iyDHHwEjWBJKYW5FPrpW" name="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra" alt="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra" src="https://cdn.mos.cms.futurecdn.net/A6iyDHHwEjWBJKYW5FPrpW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3506" height="1972" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the Galaxy Z Fold 8 Ultra proves that foldable cameras are no longer scaled-down afterthoughts, I wouldn’t say it has completely earned the "Ultra" crown across the board. For a phone bearing Samsung’s most prestigious naming convention, it can’t afford to come up short in any category — yet it still does.</p><p>The Galaxy S26 Ultra remains the undisputed camera king of Samsung's lineup. Thanks to the wider f/1.4 aperture of its main camera and its dedicated 50MP 5x periscope lens, the S26 Ultra consistently pulls ahead in the areas that separate the good from the great: low-light environments, dynamic range handling, and long-range telephoto zoom. If you want the absolute best camera results, the S26 Ultra is still the phone to get.</p><p>However, if you want the versatility of a foldable, the Z Fold 8 Ultra gets dangerously close in several areas. Still, falling short in low-light and telephoto performance is a tough pill to swallow considering the staggering price tag attached to Samsung's newest foldable.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQwPpX"></div>                            </div>                            <script src="https://kwizly.com/embed/WQwPpX.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/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200">Galaxy Z Fold 8 vs. Fold 8 Ultra camera zoom test: Don't spend the extra $200 until you see this</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/this-is-the-pixel-11-pro-fold-and-this-is-when-pre-orders-officially-start">This is the Pixel 11 Pro Fold — and this is when pre-orders officially start</a></li><li><a href="https://www.tomsguide.com/phones/i-asked-siri-ai-and-gemini-a-series-of-increasingly-bizarre-questions-to-see-how-they-responded-heres-what-happened">I asked Siri AI and Gemini a series of increasingly bizarre questions to see how they responded —here's what happened</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/how-ultra-are-the-galaxy-z-fold-8-ultras-cameras-i-put-them-to-the-test-against-the-galaxy-s26-ultra</link>
                                                                            <description>
                            <![CDATA[ I put the Galaxy Z Fold 8 Ultra to the test against the Galaxy S26 Ultra to see if its camera performance is "Ultra" worthy. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UbrWxZnit2QxzjJm7UmYiG</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TnA5425ZLKYYYgLYV3DJDG-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 08 Aug 2026 09:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/TnA5425ZLKYYYgLYV3DJDG-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra rear cameras]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra rear cameras]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra rear cameras]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TnA5425ZLKYYYgLYV3DJDG-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung’s been making its “Ultra” phones for years under the Galaxy S banner, but this year marks the first time the title is being used for a foldable phone. Needless to say, Samsung is trying to change the narrative with the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a> — by slapping its premier "Ultra" badge on a foldable for the very first time.</p><p>On paper, it packs the flagship hardware specs that I know appeal to hardcore fans who’ve remained faithful to the Galaxy S line for years, including the same 200MP main sensor as the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>. But when you’re paying a massive premium for a phone that folds, the cameras can’t come up short against the traditional slab flagship.</p><p>There are valid reasons why Samsung’s primary flagship remains the <a href="https://www.tomsguide.com/us/best-phone-cameras,review-2272.html">best camera phone</a> around, armed with a quadruple camera setup that includes two telephoto lenses — whereas the Z Fold 8 Ultra comes with just a single telephoto lens with a shorter optical range. To see if Samsung’s newest foldable genuinely earns its name, I captured side-by-side photo sets with both the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra">Galaxy Z Fold 8 Ultra and the Galaxy S26 Ultra</a>. Here’s what I found.</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-camera-specifications"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Camera specifications</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p><strong>Galaxy S26 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Main Camera</strong></p></td><td  ><p>200MP (f/1.7)</p></td><td  ><p>200MP (f/1.4)</p></td></tr><tr><td class="firstcol " ><p><strong>Ultrawide Camera</strong></p></td><td  ><p>50MP (f/1.9)</p></td><td  ><p>50MP (f/1.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Telephoto Cameras</strong></p></td><td  ><p>• 10MP 3x telephoto (f/2.4)</p></td><td  ><p>• 10MP 3x telephoto (f/2.4)</p><p>• 50MP 5x telephoto (f/2.9)</p></td></tr><tr><td class="firstcol " ><p><strong>Zoom Range</strong></p></td><td  ><p>Up to 30x Space Zoom</p></td><td  ><p>Up to 100x Space Zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Cameras</strong></p></td><td  ><p>10MP Cover Screen (f/2.2) + 10 MP Inner Display (f/2.2)</p></td><td  ><p>12MP (f2.2)</p></td></tr></tbody></table></div><p>What’s really fascinating when looking at the specs alone is that the cameras are not entirely identical. Despite both devices sharing a 200MP resolution for their main sensors and a 50MP (f/1.9) ultrawide camera, the Galaxy S26 Ultra technically holds an edge in optical range and low-light capabilities.</p><p>For starters, the S26 Ultra features a wider f/1.4 aperture compared to the Z Fold 8 Ultra’s f/1.7, allowing more light to enter the sensor — which should result in better low-light performance, less noise, and blur-free action shots.</p><p>Over in the telephoto department, the S26 Ultra also benefits from dual telephoto lenses, complete with a superior 50MP sensor featuring 5x optical zoom. In contrast, the newer Z Fold 8 Ultra relies on just a single 10MP telephoto camera with a shorter 3x optical zoom. These specs alone tell me there’s no way the Z Fold 8 Ultra is going to match the S26 Ultra in sheer telephoto performance.</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-200mp-high-resolution"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: 200MP high resolution</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/cvvbtvqXhuKNV5PsiYQDfF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/8rSb7RZZHv5rRpcnryAM5d-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Future</small></figcaption></figure></figure><p>These first two shots illustrate the amount of detail captured when set to their maximum 200MP photo option. Not only do both produce massive file sizes, but the differences between them appear minimal at first glance. Looking at the full scene, it’s great that both phones balance the exposure evenly, though the S26 Ultra is slightly brighter in the shadows.</p><p>Zooming in, however, reveals that the Z Fold 8 Ultra retains sharper details and definition almost everywhere. From the base of the tree to the ornate floral arrangement hanging over the terrace in the background, I’d give this round to the Z Fold 8 Ultra.</p><p><strong>Winner:</strong> Galaxy Z Fold 8 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-colors"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Colors</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/BKQv5NjgvAqWQGAzbbDNsi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Tbcsv6heCjtKjWPzdCbZsi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Judging by color performance alone, both phones deliver vibrant shots of the flower arrangement inside Whole Foods.</p><p>While the S26 Ultra has a penchant for a warmer color temperature — evident in how the pink flowers take on a slightly orange tone — the Z Fold 8 Ultra’s shot isn’t too far off, albeit not quite as warm. Still, neither phone clearly outperforms the other when it comes to color rendering here.</p><p><strong>Winner:</strong> tie</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-ultrawide"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Ultrawide</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/bawxTFUiEstaXNAb2AR6hF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/rNrVsvsoJRZYHsByiKvHoV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Given that both phones share identical 50MP (f/1.9) ultrawide cameras, I’m not surprised that this wide shot of Bryant Park is almost too close to call. Both devices capture impressive sharpness across the frame with minimal distortion around the edges.</p><p>However, looking closely at the lighting dynamics, the Galaxy S26 Ultra handles exposure and shadows slightly better — a trend I previously noted in the 200MP test. Notice how the people seated in the foreground have better visibility and contrast on the S26 Ultra, whereas the Z Fold 8 Ultra pulls a bit more shadow detail at the expense of a somewhat flatter tone.</p><p>Once again, it's a narrow victory, but the S26 Ultra takes it thanks to its superior dynamic range.</p><p><strong>Winner: </strong>Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-dynamic-range"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Dynamic Range</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/bDSoaB6YXxuXKoTqHU3TfF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/MmwGZtHYFfdU4SzBWyJnmV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>With the sun coming from behind, the background and sky are much brighter than the metal statue sitting in the shadow — a setup that clearly reveals how their dynamic range performances differ.</p><p>I’m initially drawn to the Galaxy Z Fold 8 Ultra’s punchier overall shot, which is largely due to how it boosts contrast. Doing so, however, comes at the expense of the highlights in the trees and the glass building in the background.</p><p>On the other hand, the Galaxy S26 Ultra exhibits superior dynamic range. It manages to tone down the harsh highlights on the metal statue while pulling up subtle details in the darker foliage and shadowed steps along the bottom left. Ultimately, the S26 Ultra achieves a more balanced, natural exposure without blowing out the brightest areas or over-darkening the shadows.</p><p><strong>Winner: </strong>Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-portrait"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Portrait</span></h2><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=b187e00e-91d0-11f1-ba1b-0e6f42328d7d"></iframe><p>At first glance, I don’t notice a whole lot of difference in the way they approach portrait shots, as both apply just the right amount of bokeh to blur the background while preserving clean edge separation around my colleague, <a href="https://www.tomsguide.com/author/mark-spoonauer">Mark Spoonauer</a>.</p><p>The Galaxy Z Fold 8 Ultra produces a natural skin tone and plenty of fine detail across Mark’s face and shirt. However, closer inspection reveals that there are sharper details captured by the Galaxy S26 Ultra’s portrait shot. Most noticeably, the fabric of his shirt and the stitching around his pocket show superior definition.</p><p><strong>Winner:</strong> Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-selfie"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Selfie</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/e8xVg6WGnZz9BPZSEvcrni-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - Front camera<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2jRFCRn8ANYoQ8b5WJRcoi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>The S26 Ultra has a slight advantage on paper for taking selfies thanks to its 12MP front camera. The Z Fold 8 Ultra features dual 10MP selfie shooters, but for this test, I’m specifically comparing the cover screen camera.</p><p>It’s a very close call, though, with neither phone clearly outperforming the other. I really like the amount of sharp detail both capture across Mark’s face, as well as the texture of his shirt. Meanwhile, both devices manage to lift the exposure nicely in the shaded areas in the background.</p><p><strong>Winner:</strong> tie</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-low-light"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Low light</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/3uREWtvkGoHw9vP6mPBsGF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/nvYuSJhn6iiHxBXuiJCEcV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>When shooting in dimly lit conditions, the main sensor aperture specs show their real-world impact. The Galaxy S26 Ultra’s wider f/1.4 aperture pulls in significantly more light than the Z Fold 8 Ultra’s f/1.7 lens, creating a slightly brighter scene overall.</p><p>Looking at the backyard patio shot, the Galaxy S26 Ultra does a much better job illuminating the white fence in the background, the lawn, and the texture of the patio pavers.</p><p>Don’t get me wrong, the Galaxy Z Fold 8 Ultra still produces an excellent low-light photo that brightens an otherwise dark scene, but those same background areas remain darker and cast heavier shadows around the base of the chairs and side table. Thanks to its wider aperture, the S26 Ultra also retains cleaner details across the patio furniture without introducing excessive noise.</p><p><strong>Winner: </strong>Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-telephoto"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Telephoto</span></h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/j6MuaLqukbwjyN32Z4TfZF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/CEqvfgE3Etv4t8D7jWbPiV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/fVsU3F4aDfFac9ZQGj9wMF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/WUWwCqzw5XMCMJbtVZGhgV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/dpLtDThSHF5E4Qfuxs8ZGF-1920-80.jpg" alt="Samsung Galaxy Z Fold 8 Ultra camera sample." /><figcaption>Galaxy Z Fold 8 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/xTwrPNttz9jRWzYW7cn5cV-1920-80.jpg" alt="Samsung Galaxy S26 Ultra camera sample." /><figcaption>Galaxy S26 Ultra.<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Where I find the most substantial difference between them is in their telephoto performance. At shorter distances, they deliver nearly identical results, but the shots above of the ice cream truck show how the Galaxy S26 Ultra offers true Ultra-level performance.</p><p>Comparing them across 5x, 10x, and 30x zoom levels highlights the clear advantage of the Galaxy S26 Ultra’s setup. At 5x zoom, both phones capture solid shots of the ice cream truck menu, but the S26 Ultra renders crisper text across the menu labels with less digital noise.</p><p>The divide widens significantly at 10x: the S26 Ultra retains sharp edges, vibrant contrast, and legible text on the menu options. To capture the same framing, the Z Fold 8 Ultra relies on digital cropping from its single 10MP 3x telephoto lens, leaving the 10x image noticeably softer with smoother, watercolor-like textures.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=3ddb19aa-91d0-11f1-ba1b-0e6f42328d7d"></iframe><p>Finally, at 30x zoom, the S26 Ultra’s superior optical hardware gives its image processing far better detail to work with. The text labels under each ice cream cone remain surprisingly readable, whereas the Z Fold 8 Ultra’s 30x crop produces blurred text and blob-like details.</p><p><strong>Winner: </strong>Galaxy S26 Ultra</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-verdict"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: 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:3506px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="A6iyDHHwEjWBJKYW5FPrpW" name="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra" alt="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra" src="https://cdn.mos.cms.futurecdn.net/A6iyDHHwEjWBJKYW5FPrpW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3506" height="1972" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While the Galaxy Z Fold 8 Ultra proves that foldable cameras are no longer scaled-down afterthoughts, I wouldn’t say it has completely earned the "Ultra" crown across the board. For a phone bearing Samsung’s most prestigious naming convention, it can’t afford to come up short in any category — yet it still does.</p><p>The Galaxy S26 Ultra remains the undisputed camera king of Samsung's lineup. Thanks to the wider f/1.4 aperture of its main camera and its dedicated 50MP 5x periscope lens, the S26 Ultra consistently pulls ahead in the areas that separate the good from the great: low-light environments, dynamic range handling, and long-range telephoto zoom. If you want the absolute best camera results, the S26 Ultra is still the phone to get.</p><p>However, if you want the versatility of a foldable, the Z Fold 8 Ultra gets dangerously close in several areas. Still, falling short in low-light and telephoto performance is a tough pill to swallow considering the staggering price tag attached to Samsung's newest foldable.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-WQwPpX"></div>                            </div>                            <script src="https://kwizly.com/embed/WQwPpX.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/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200">Galaxy Z Fold 8 vs. Fold 8 Ultra camera zoom test: Don't spend the extra $200 until you see this</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/this-is-the-pixel-11-pro-fold-and-this-is-when-pre-orders-officially-start">This is the Pixel 11 Pro Fold — and this is when pre-orders officially start</a></li><li><a href="https://www.tomsguide.com/phones/i-asked-siri-ai-and-gemini-a-series-of-increasingly-bizarre-questions-to-see-how-they-responded-heres-what-happened">I asked Siri AI and Gemini a series of increasingly bizarre questions to see how they responded —here's what happened</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Is the Galaxy Z Fold 8's crease really that good? I compared it to the current reigning champ ]]></title>
                                                                                                <dc:content><![CDATA[ <p>While everybody has been talking about the new shape of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8</a>, and to be fair, it's been very pleasant to use, one of the most overlooked upgrades on Samsung's new book-style foldables is <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one">the less noticeable crease</a>.</p><p>Samsung says it has significantly reduced the crease thanks to its new <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex Titanium</a> display technology, which debuts on both the Galaxy Z Fold 8 and the <a href="https://www.tomsguide.com/phones/samsung-phones/i-used-a-thermal-camera-to-see-how-hot-the-galaxy-z-fold-8-ultra-gets-compared-to-the-galaxy-s26-ultra-heres-what-happened">Galaxy Z Fold 8 Ultra</a>.</p><p>But is it actually enough to catch up with other foldable phones that already have less visible creases? Earlier this year, I <a href="https://www.tomsguide.com/phones/android-phones/i-have-been-testing-oppo-find-n6-crease-free-foldable-phone">came away impressed by the Oppo Find N6</a>, particularly because of how subtle its crease was. So, I compared the Galaxy Z Fold 8 against the Oppo Find N6 to see which one comes out on top.</p><div class="product"><a data-dimension112="b84ccd80-926d-11f1-8619-bd41a0cddc53" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1899" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Unlocked-Graphite/dp/B0H126B3KV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Samsung has a brand new kind of foldable with the passport-shaped Galaxy Z Fold 8. This foldable comes with a 7.6-inch folding display, with 4:3 aspect ratio that's designed for viewing video content.. There's also a 5.5-inch cover display, strong performance and battery life, plus a pair of great cameras on the back.</p><p>Buy the Z Fold 8 from Amazon now and you'll get a $350 voucher thrown in as well.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Unlocked-Graphite/dp/B0H126B3KV/" target="_blank" rel="nofollow" data-dimension112="b84ccd80-926d-11f1-8619-bd41a0cddc53" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1899">View Deal</a></p></div><h2 id="can-samsung-match-oppo-s-zero-feel-crease">Can Samsung match Oppo's "Zero-Feel" crease? </h2><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="JTcFhBxyXam8DFnAzF5RK5" name="z-fold-8-vs-oppo-find-n6-crease-1" alt="Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6" src="https://cdn.mos.cms.futurecdn.net/JTcFhBxyXam8DFnAzF5RK5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>When Oppo announced the Find N6 earlier this year, one of the biggest talking points was its "zero-feel" crease. The company claimed it had reduced the crease to the point where you could barely see or even feel it while using the phone. </p><p>Having gone hands-on with the device, I can confirm that claim wasn't just marketing hype. The crease really was impressively subtle. Naturally, that made me even more curious to see what Samsung had done with the Galaxy Z Fold 8.</p><p>To compare the two, I placed the Galaxy Z Fold 8 and the Oppo Find N6 side by side under the same lighting conditions. I looked at both phones with the displays turned on and off, viewed them from multiple angles, and repeatedly ran my finger across each crease to compare how they looked and, perhaps more importantly, how they felt. </p><p>Right away, it became obvious that the two companies have taken very different approaches. </p><p>Samsung says its new <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex Titanium display technology</a> redesigns the folding display to reduce the crease. However, structurally, the Galaxy Z Fold 8 is still the same as previous generations, with a single, clearly defined crease running down the middle of the display. </p><p>It's much shallower than on previous Galaxy Fold devices, but it's still easy to spot under direct light. </p><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="xSi6UvtEUxGpjacaJfhQR5" name="z-fold-8-vs-oppo-find-n6-crease-3" alt="Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6" src="https://cdn.mos.cms.futurecdn.net/xSi6UvtEUxGpjacaJfhQR5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>The Oppo Find N6, on the other hand, looks quite different. Rather than one defined crease, the center of the display appears more like a series of tiny ripples. Neither phone hides the crease completely, but the two companies have clearly taken different approaches. </p><p>To be honest, I don't think either phone has a huge visual advantage when the displays are turned off. How visible the crease is depends almost entirely on the lighting and the angle you're looking at the screen from.</p><p>Where I did notice a difference was in how the crease feels. Running my finger across the Galaxy Z Fold 8, I could still feel a fairly noticeable dip before reaching the other side of the display.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Mxpj35cmMMyeokyzLdF9e5" name="z-fold-8-vs-oppo-find-n6-crease-4" alt="Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6" src="https://cdn.mos.cms.futurecdn.net/Mxpj35cmMMyeokyzLdF9e5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>The Oppo Find N6 feels different. Instead of one distinct crease, your finger glides across a series of much subtler ripples. The transition is smoother overall, and if you aren't deliberately looking for it, you barely notice the crease. </p><p>With the displays turned on, I really struggled to spot the crease on either phone. Whether I was gaming, browsing articles, or watching videos, it quickly faded into the background to the point where I barely noticed it. </p><p>Samsung's new <a href="https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing">anti-reflective coating</a> on the inner display also helps here by reducing reflections that would otherwise make the crease more obvious under bright lighting. </p><h2 id="winner">Winner</h2><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="rAiYxSBr6axP3qYqgWdJa5" name="z-fold-8-vs-oppo-find-n6-crease-5" alt="Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6" src="https://cdn.mos.cms.futurecdn.net/rAiYxSBr6axP3qYqgWdJa5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>So if I had to pick a winner, I'd probably go with the Oppo Find N6. I'll be honest with you, no foldable that closes completely is ever going to have a perfectly invisible crease. That's simply the nature of the form factor, and anything that folds is going to crease.</p><p>The Find N6's crease feels just a little smoother under your finger, and overall, I'd give it a narrow win.</p><p>That said, I don't think that should stop anyone from buying the Galaxy Z Fold 8. Samsung has made a massive leap forward compared to previous Galaxy Fold devices. </p><p>The crease no longer feels like one of the phone's biggest compromises, and once the display is turned on, the new anti-reflective coating actually helps make it even less noticeable during everyday use.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/best-galaxy-z-fold-8-deals-and-galaxy-z-fold-8-ultra-sales">Galaxy Z Fold 8 deals are here: how to save up $1,200 on Samsung's new foldables</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/the-tech-world-hyped-up-the-galaxy-z-fold-8s-crease-free-display-heres-a-reality-check-after-7-days">The tech world hyped up the Galaxy Z Fold 8's 'crease-free' display — here's a reality check after 7 days</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-report-reveals-this-is-how-apple-is-killing-the-crease">iPhone Fold report reveals this is how Apple is killing the crease</a></li></ul><div data-widget-type="multimodelreview" data-model-name="Samsung Galaxy Z Fold 8,Samsung Galaxy Z Fold 8 Ultra"></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/comparing-galaxy-z-fold-8-vs-oppo-find-n6-crease</link>
                                                                            <description>
                            <![CDATA[ Samsung's Galaxy Z Fold 8 takes on the Oppo Find N6's "zero-feel" crease ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">nhotHzLoGEG6cb2hPnM3eR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/7q4j44puYb7f4VMuqkAg75-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 08 Aug 2026 08:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Sanuj Bhatia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8p5BvMVA7cnu5AWkxnTjRC-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/7q4j44puYb7f4VMuqkAg75-1920-80.jpg">
                                                            <media:credit><![CDATA[Sanuj Bhatia / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6]]></media:description>                                                            <media:text><![CDATA[Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6]]></media:text>
                                <media:title type="plain"><![CDATA[Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/7q4j44puYb7f4VMuqkAg75-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>While everybody has been talking about the new shape of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Samsung Galaxy Z Fold 8</a>, and to be fair, it's been very pleasant to use, one of the most overlooked upgrades on Samsung's new book-style foldables is <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one">the less noticeable crease</a>.</p><p>Samsung says it has significantly reduced the crease thanks to its new <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex Titanium</a> display technology, which debuts on both the Galaxy Z Fold 8 and the <a href="https://www.tomsguide.com/phones/samsung-phones/i-used-a-thermal-camera-to-see-how-hot-the-galaxy-z-fold-8-ultra-gets-compared-to-the-galaxy-s26-ultra-heres-what-happened">Galaxy Z Fold 8 Ultra</a>.</p><p>But is it actually enough to catch up with other foldable phones that already have less visible creases? Earlier this year, I <a href="https://www.tomsguide.com/phones/android-phones/i-have-been-testing-oppo-find-n6-crease-free-foldable-phone">came away impressed by the Oppo Find N6</a>, particularly because of how subtle its crease was. So, I compared the Galaxy Z Fold 8 against the Oppo Find N6 to see which one comes out on top.</p><div class="product"><a data-dimension112="b84ccd80-926d-11f1-8619-bd41a0cddc53" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1899" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Unlocked-Graphite/dp/B0H126B3KV/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Samsung has a brand new kind of foldable with the passport-shaped Galaxy Z Fold 8. This foldable comes with a 7.6-inch folding display, with 4:3 aspect ratio that's designed for viewing video content.. There's also a 5.5-inch cover display, strong performance and battery life, plus a pair of great cameras on the back.</p><p>Buy the Z Fold 8 from Amazon now and you'll get a $350 voucher thrown in as well.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Unlocked-Graphite/dp/B0H126B3KV/" target="_blank" rel="nofollow" data-dimension112="b84ccd80-926d-11f1-8619-bd41a0cddc53" data-action="Deal Block" data-label="Galaxy Z Fold 8" data-dimension48="Galaxy Z Fold 8" data-dimension25="$1899">View Deal</a></p></div><h2 id="can-samsung-match-oppo-s-zero-feel-crease">Can Samsung match Oppo's "Zero-Feel" crease? </h2><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="JTcFhBxyXam8DFnAzF5RK5" name="z-fold-8-vs-oppo-find-n6-crease-1" alt="Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6" src="https://cdn.mos.cms.futurecdn.net/JTcFhBxyXam8DFnAzF5RK5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>When Oppo announced the Find N6 earlier this year, one of the biggest talking points was its "zero-feel" crease. The company claimed it had reduced the crease to the point where you could barely see or even feel it while using the phone. </p><p>Having gone hands-on with the device, I can confirm that claim wasn't just marketing hype. The crease really was impressively subtle. Naturally, that made me even more curious to see what Samsung had done with the Galaxy Z Fold 8.</p><p>To compare the two, I placed the Galaxy Z Fold 8 and the Oppo Find N6 side by side under the same lighting conditions. I looked at both phones with the displays turned on and off, viewed them from multiple angles, and repeatedly ran my finger across each crease to compare how they looked and, perhaps more importantly, how they felt. </p><p>Right away, it became obvious that the two companies have taken very different approaches. </p><p>Samsung says its new <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex Titanium display technology</a> redesigns the folding display to reduce the crease. However, structurally, the Galaxy Z Fold 8 is still the same as previous generations, with a single, clearly defined crease running down the middle of the display. </p><p>It's much shallower than on previous Galaxy Fold devices, but it's still easy to spot under direct light. </p><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="xSi6UvtEUxGpjacaJfhQR5" name="z-fold-8-vs-oppo-find-n6-crease-3" alt="Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6" src="https://cdn.mos.cms.futurecdn.net/xSi6UvtEUxGpjacaJfhQR5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>The Oppo Find N6, on the other hand, looks quite different. Rather than one defined crease, the center of the display appears more like a series of tiny ripples. Neither phone hides the crease completely, but the two companies have clearly taken different approaches. </p><p>To be honest, I don't think either phone has a huge visual advantage when the displays are turned off. How visible the crease is depends almost entirely on the lighting and the angle you're looking at the screen from.</p><p>Where I did notice a difference was in how the crease feels. Running my finger across the Galaxy Z Fold 8, I could still feel a fairly noticeable dip before reaching the other side of the display.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="Mxpj35cmMMyeokyzLdF9e5" name="z-fold-8-vs-oppo-find-n6-crease-4" alt="Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6" src="https://cdn.mos.cms.futurecdn.net/Mxpj35cmMMyeokyzLdF9e5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>The Oppo Find N6 feels different. Instead of one distinct crease, your finger glides across a series of much subtler ripples. The transition is smoother overall, and if you aren't deliberately looking for it, you barely notice the crease. </p><p>With the displays turned on, I really struggled to spot the crease on either phone. Whether I was gaming, browsing articles, or watching videos, it quickly faded into the background to the point where I barely noticed it. </p><p>Samsung's new <a href="https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing">anti-reflective coating</a> on the inner display also helps here by reducing reflections that would otherwise make the crease more obvious under bright lighting. </p><h2 id="winner">Winner</h2><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="rAiYxSBr6axP3qYqgWdJa5" name="z-fold-8-vs-oppo-find-n6-crease-5" alt="Comparing the crease of the Samsung Galaxy Z Fold 8 vs. Oppo Find N6" src="https://cdn.mos.cms.futurecdn.net/rAiYxSBr6axP3qYqgWdJa5-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>So if I had to pick a winner, I'd probably go with the Oppo Find N6. I'll be honest with you, no foldable that closes completely is ever going to have a perfectly invisible crease. That's simply the nature of the form factor, and anything that folds is going to crease.</p><p>The Find N6's crease feels just a little smoother under your finger, and overall, I'd give it a narrow win.</p><p>That said, I don't think that should stop anyone from buying the Galaxy Z Fold 8. Samsung has made a massive leap forward compared to previous Galaxy Fold devices. </p><p>The crease no longer feels like one of the phone's biggest compromises, and once the display is turned on, the new anti-reflective coating actually helps make it even less noticeable during everyday use.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/best-galaxy-z-fold-8-deals-and-galaxy-z-fold-8-ultra-sales">Galaxy Z Fold 8 deals are here: how to save up $1,200 on Samsung's new foldables</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/the-tech-world-hyped-up-the-galaxy-z-fold-8s-crease-free-display-heres-a-reality-check-after-7-days">The tech world hyped up the Galaxy Z Fold 8's 'crease-free' display — here's a reality check after 7 days</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-fold-report-reveals-this-is-how-apple-is-killing-the-crease">iPhone Fold report reveals this is how Apple is killing the crease</a></li></ul><div data-widget-type="multimodelreview" data-model-name="Samsung Galaxy Z Fold 8,Samsung Galaxy Z Fold 8 Ultra"></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Fold 8 Ultra vs Galaxy Z Fold 7 — are this year's upgrades really worth it? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Samsung Galaxy Z Fold 8 Ultra</a> is a fantastic foldable, with a lot of great upgrades that (mostly) stands up to the Ultra moniker. But the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7 </a>was also a fantastic foldable when it was released last year, with our review declaring it to be the foldable phone we've been waiting for.</p><p>Obviously this leaves us with a few questions that need answering. The Z Fold 8 Ultra is the better phone, but is it still good enough to supplant the Z Fold 7 as the foldable you should buy? After all, the Z Fold 8 Ultra is more expensive, and the Z Fold 7 is likely to get some price cuts in the wake of the Ultra's launch.</p><p>So how does the Galaxy Z Fold 8 Ultra compare to the Galaxy Z Fold 7, and which of these foldables is right for you?</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-specs"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galazy Z Fold 8 Ultra</strong></p></td><td  ><p><strong>Samsung Galazy Z Fold 7</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $2,099</p></td><td  ><p>From $1,999</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>8 inches AMOLED (2184 x 1968, 1-120Hz)</p></td><td  ><p>8 inches AMOLED (2184 x 1968, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover Display</strong></p></td><td  ><p>6.5 inches AMOLED (2520 x 1080, 1-120Hz)</p></td><td  ><p>6.5 inches AMOLED (2520 x 1080, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td><td  ><p>Snapdragon 8 Elite </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB / 16GB</p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB / 512GB / 1TB</p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Front Camera</strong></p></td><td  ><p>10MP, 10MP</p></td><td  ><p>10MP, 10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Camera</strong></p></td><td  ><p>200MP wide, 50MP ultra-wide, 10MP telephoto (3x optical)</p></td><td  ><p>200MP wide, 12MP ultra-wide, 10MP telephoto ( 3x opticazoom)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>4,400 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired, 20W wireless</p></td><td  ><p>25W wired, 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.16 inches) unfolded</p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.17 inches) unfolded</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>215 grams (7.5 ounces)</p></td><td  ><p>215 grams (7.5 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP48</p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p>Colors</p></td><td  ><p>Violet shadow, Cream, Graphite, Violet Green (online exclusive)</p></td><td  ><p>Blue Shadow, Silver Shadow, Jet-black, Mint</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-price-availability"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Price & availability</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3328px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T6UGidvhwk5Am5sBqHvBVS" name="Z Fold 8 Ultra vs Z Fold 7-8" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/T6UGidvhwk5Am5sBqHvBVS-1920-80.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>The Samsung Galaxy Z Fold 7 has been on sale since last July, with prices starting at $1,999 for a model with 12GB of RAM and 256GB of storage. 512GB is available for $2,199, while a 1TB model with 16GB of RAM can be purchased for $2,499. </p><p>Color options include Silver Shadow, Jet Black, Blue Shadow and the Samsung-exclusive Mint. This phone is also likely to be discounted in the wake of the Z 8 series launch, since it's already a year old.</p><p>The Samsung Galaxy Z Fold 8 Ultra goes on sale on August 7, with prices starting at $2,199 for a model with 12GB of RAM and 256GB storage. 512GB raises the price to $2,299, while 1TB with 16GB of RAM will set you back $2,699.</p><p>Color options include Violet Shadow, Cream, Graphite and the Samsung-exclusive Green Shadow.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-design-and-display"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Design and Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TWaz6ndtJJBBsfEpVDj2cS" name="Z Fold 8 Ultra vs Z Fold 7-2" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/TWaz6ndtJJBBsfEpVDj2cS-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Samsung didn't offer any bold redesigns with the Z Fold 8 Ultra, and the new foldable's shape and size is more or less identical to the Galaxy Z Fold 7. They're not quite the same, since Z Fold 7 cases don't appear to fit on the back of the 8 Ultra, but it's close enough that you'd need precise measuring tools to notice.</p><p>The biggest upgrade is that the Z Fold 8 Ultra features a new <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex Titanium display</a>, which offers improved durability and significantly less creasing in the middle. <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one">It's not quite crease-free</a>, but it is almost invisible compared to the Z Fold 7. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2417px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="xYL3dLrXaNVRNg92GfxqsR" name="Z Fold 8 Ultra vs Z Fold 7-4" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/xYL3dLrXaNVRNg92GfxqsR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2417" height="1360" attribution="" endorsement="" 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 Fold 8 Ultra also has a much better screen when it comes to dealing with bright light. Both phones have the same high resolution screens and adaptive 1-120Hz refresh rates, but the Z Fold 7 isn't nearly as bright as the 8 Ultra. In fact, last year's foldable recorded a peak brightness of 2,245 nits, while the Z Fold 8 Ultra hit 2,687 nits. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@mspoonyg/video/7666429528071294222" data-video-id="7666429528071294222" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@mspoonyg" href="https://www.tiktok.com/@mspoonyg">@mspoonyg</a>                            <p></p><a target="_blank" title="♬ Thank You for Sunshine - House Duduk Music" href="https://www.tiktok.com/music/Thank-You-for-Sunshine-7650727836295612417">♬ Thank You for Sunshine - House Duduk Music</a></section>                    </blockquote></div>                <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing">anti-reflective coating on the newer foldable</a> also makes it a lot easier to use the Fold 8 Ultra in bright conditions, and it makes a shocking amount of difference in reducing glare. By which I mean you won't see your own silhouette staring back at you nearly as much.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-performance"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2891px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="xqV8DFuJtvGXYn6VEmv86S" name="Z Fold 8 Ultra vs Z Fold 7-9" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/xqV8DFuJtvGXYn6VEmv86S-1920-80.jpg" mos="" align="middle" fullscreen="" width="2891" height="1626" attribution="" endorsement="" 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 Galaxy Z Fold 8 Ultra is the first Galaxy foldable to feature the custom "for Galaxy" chipset, which means it shares the same <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-performance-face-off-snapdragon-8-elite-gen-5-vs-exynos-2600">Snapdragon 8 Elite Gen 5 for Galaxy chipset</a> as the Galaxy S26 series. Older foldables utilized Snapdragon's standard flagship chip, so the Z Fold 7 arrived running the same Snapdragon 8 Elite as countless other non-Samsung phones.</p><p>While the off-the-shelf chip is no slouch, the upgrade to a For Galaxy chipset means that the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-benchmarked-the-results-are-in">Z Fold 8 Ultra gets to enjoy a performance boost</a> compared to its predecessor.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench (Single/Multicore)</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>3,733/11,457</p></td><td  ><p>49.24/12,950</p></td><td  ><p>71715</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>3,052/9,735</p></td><td  ><p>41.21/10,812</p></td><td  ><p>61299</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>3,785 / 11,563</p></td><td  ><p>49.37 / 12,984</p></td><td  ><p>83047 (TensorFlow Lite QNN)</p></td></tr></tbody></table></div><p>As you can see in the table above, the Z Fold 8 Ultra finished Geekbench 6 with a single-core score of 3,733 and a multi-core score of 11,457. That's compared to the 3,052 and 9,735 scores recorded by the Z Fold 7 during the same benchmarking test. That's quite the jump, especially on the multi-core testing.</p><p>Graphics performance is a pretty similar story, with the Z Fold 8 Ultra scoring 12,950 in 3DMark's Solar Bay Unlimited benchmark test, with an average framerate of 49.24 fps. The Z Fold 7 came out with 10,912 and 41.21 fps which, while not terrible performance, seriously lags behind. Geekbench's AI test is more of the same with the Z Fold 8 Ultra coming in with a score of 71,715 to the Z Fold 7's 59,663.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-cameras"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3519px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="WcYimQVpPWYAFuWxKQJdES" name="Z Fold 8 Ultra vs Z Fold 7-6" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/WcYimQVpPWYAFuWxKQJdES-1920-80.jpg" mos="" align="middle" fullscreen="" width="3519" height="1979" attribution="" endorsement="" 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 camera situation on the Galaxy Z Fold 8 Ultra is a little hit and miss, though the same is true of the Z Fold 7. Both phones share the same 200MP main camera lens, 10MP telephoto lens with 3x optical zoom and a pair of 10MP selfie cameras (one for each screen). </p><p>However, the 8 Ultra's ultrawide camera has been given a much-needed update, increasing the resolution to 50MP — among smaller changes. But saying the phones both have similar camera hardware doesn't really tell us how different the photos actually are — especially now that software plays such a huge part in the process.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=2c06f5cc-90f5-11f1-ba1b-0e6f42328d7d"></iframe><p>You'd think that the quality of the 200MP main lens would be identical across both phones, but that actually isn't the case. They seem alike at first glance, but the Z Fold 8 Ultra is actually picking up a lot more detail compared to its predecessor. </p><p>The text on this mail box is a lot more legible, and the finer details in the brickwork stand out a lot more. Overall, the Fold 8 Ultra delivers a much clearer and crisper image.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=17b020c6-90f5-11f1-ba1b-0e6f42328d7d"></iframe><p>Despite the big bump in resolution, the difference in the ultrawide shots are pretty subtle — just as they were when I tested the cameras for the Galaxy Z Fold 8 Ultra review. The Z Fold 8 Ultra offers crisper image quality and a slightly brighter photo overall. At a glance, most won't be able to pick up the subtleties of how the two cameras are different.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=40a85188-90f5-11f1-ba1b-0e6f42328d7d"></iframe><p>Macro shots aren't that dissimilar either, and both phones are able to capture the smaller details from close-up shots. However, the Z Fold 7's shot is noticeably more washed out, and doesn't feature the same deeper coloring of the Z Fold 8 Ultra.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=e8c3cc5e-90f4-11f1-ba1b-0e6f42328d7d"></iframe><p>The selfie camera quality is more or less identical on both phones. Some areas are clearer than others, depending on which side you're looking at, but that seems to be due to the variations on focus rather than the actual quality of the final shot. The Z Fold 8 Ultra is a little bit brighter, though.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=cfc2f298-90f4-11f1-ba1b-0e6f42328d7d"></iframe><p>Portrait mode is exactly the same, with the exact same focus variations and brightness difference as the regular selfie mode. Neither photo has any particular characteristics that make it superior to the other, and the bokeh effect looks exactly the same across both devices.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=7fe0a734-90f4-11f1-ba1b-0e6f42328d7d"></iframe><p>Speaking of identical, the same is true of the telephoto lens at 3x optical zoom. The quality of the shot on both phones is pretty poor, and it's an upgrade Samsung desperately needs to make ahead of the Z Fold 9 launch next year.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=afe785b0-90f4-11f1-ba1b-0e6f42328d7d"></iframe><p>Pushing the magnification up to 10x doesn't make any difference either. While the details are being picked up by the camera, the actual quality of the final shot is atrocious compared to other flagship phones that cost considerably less money — including Samsung's own Galaxy S26 Ultra.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=00141e9a-90f5-11f1-ba1b-0e6f42328d7d"></iframe><p>Samsung made a point of emphasizing how much it was improving low light capabilities with the Z Fold 8 Ultra, and it definitely looks like it's succeeded. Compared to the Z Fold 7, the night-time shots are brighter, crisper and pick up a lot more detail from the mail box. In fact, the Z Fold 7 shot blurs out the letters V and R around the crown at the top</p><p>Samsung has clearly made some improvements to the Galaxy Z Fold 8 Ultra, especially where low light photography is concerned. But a lot of the daytime upgrades seem to be a lot more subtle, and less noticeable to the casual observer. Whether that minor boost is worth it for you all depends on which phone you have, and whether the Z Fold 8 Ultra's other upgrades matter to you or not.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-battery-charging"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Battery & charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3531px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="imtV2afR8StvoQEVHJmnSS" name="Z Fold 8 Ultra vs Z Fold 7-10" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/imtV2afR8StvoQEVHJmnSS-1920-80.jpg" mos="" align="middle" fullscreen="" width="3531" height="1986" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One of the biggest upgrades on the Galaxy Z Fold 8 Ultra is the fact that the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off">battery life is so much better now</a>. This is thanks to a higher capacity silicon carbon battery with 5,000 mAh capacity, compared to 4,400 mAh for the Fold 7. Our custom battery test, which involves web-surfing over a 5G connection until the power runs out, clocked the Z Fold 8 Ultra's battery life at 14 hours and 33 minutes.</p><p>While this isn't as good as the Galaxy S26 Ultra, it is almost four hours longer than the Galaxy Z Fold 7's 10 hours and 44 minutes of battery life. Under 11 hours is pretty disappointing, but hitting 14+ hours means the Z Fold 8 Ultra is far more likely to make it through a single day without recharging.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Hours : Minutes</strong></p></td><td  ><p><strong>Charging % in 30 minutes</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>14:33</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>10:44</p></td><td  ><p>54%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>16:10</p></td><td  ><p>77%</p></td></tr></tbody></table></div><p>The Z Fold 8 Ultra offers 45W wired charging compared to the Z Fold 7's 25W. That faster charging allows the phone to reclaim 76% of its battery life in just 30 minutes, compared to 54% on the Z Fold 7. Wireless charging has also increased by 5W, with up to 20W Qi2 speeds on the Z Fold 8 Ultra — though the embedded magnets are still missing from the phone.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-verdict"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3187px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ibSFwbJGnJU62HeZzyCu4S" name="Z Fold 8 Ultra vs Z Fold 7-LIST" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/ibSFwbJGnJU62HeZzyCu4S-1920-80.jpg" mos="" align="middle" fullscreen="" width="3187" height="1793" attribution="" endorsement="" 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 Samsung Galaxy Z Fold 8 Ultra has a lot of upgrades compared to last year, and the majority of them are available in areas that actually matter to your everyday use of the phone. Battery life is significantly improved, performance has taken a pretty big jump and the bright, anti-reflective display makes it significantly nicer to use this phone in a variety of conditions. </p><p>Those are all notable quality of life improvements that could make the Z Fold 8 Ultra the foldable of choice for most people. The camera changes are subtle, with the biggest difference being low-light performance.</p><p>Overall. the Fold 7 is still a very good foldable, especially when you can find it for a sizable discount. But if you're in the market for a new foldable phone, the Fold 8 Ultra is hands-down the better option.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">I just tried the new Samsung DeX on the Galaxy Z Fold 8 — and it has one huge upgrade</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/3-big-ways-the-iphone-ultra-could-beat-the-galaxy-z-fold-8">iPhone Ultra vs Galaxy Z Fold 8 — here's 3 big ways Apple could win</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200">I tested the Galaxy Z Fold 8 vs. Fold 8 Ultra to see if the lack of a telephoto zoom is a dealbreaker</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-vs-galaxy-z-fold-7-are-this-years-upgrades-really-worth-it</link>
                                                                            <description>
                            <![CDATA[ Is the Galaxy Z Fold 8 Ultra really a worthy upgrade over the Galaxy Z Fold 7? We put both phones to the test ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">iSrvHa6ZNdEiyKXRBpmYGJ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/PQzuLPfoynftVZMYbb3hGS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 08 Aug 2026 04:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/PQzuLPfoynftVZMYbb3hGS-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[samsung galaxy z fold 7 and galaxy z fold 8 ultra]]></media:description>                                                            <media:text><![CDATA[samsung galaxy z fold 7 and galaxy z fold 8 ultra]]></media:text>
                                <media:title type="plain"><![CDATA[samsung galaxy z fold 7 and galaxy z fold 8 ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/PQzuLPfoynftVZMYbb3hGS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Samsung Galaxy Z Fold 8 Ultra</a> is a fantastic foldable, with a lot of great upgrades that (mostly) stands up to the Ultra moniker. But the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7 </a>was also a fantastic foldable when it was released last year, with our review declaring it to be the foldable phone we've been waiting for.</p><p>Obviously this leaves us with a few questions that need answering. The Z Fold 8 Ultra is the better phone, but is it still good enough to supplant the Z Fold 7 as the foldable you should buy? After all, the Z Fold 8 Ultra is more expensive, and the Z Fold 7 is likely to get some price cuts in the wake of the Ultra's launch.</p><p>So how does the Galaxy Z Fold 8 Ultra compare to the Galaxy Z Fold 7, and which of these foldables is right for you?</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-specs"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Samsung Galazy Z Fold 8 Ultra</strong></p></td><td  ><p><strong>Samsung Galazy Z Fold 7</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $2,099</p></td><td  ><p>From $1,999</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p>8 inches AMOLED (2184 x 1968, 1-120Hz)</p></td><td  ><p>8 inches AMOLED (2184 x 1968, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover Display</strong></p></td><td  ><p>6.5 inches AMOLED (2520 x 1080, 1-120Hz)</p></td><td  ><p>6.5 inches AMOLED (2520 x 1080, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td><td  ><p>Snapdragon 8 Elite </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB / 16GB</p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB / 512GB / 1TB</p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Front Camera</strong></p></td><td  ><p>10MP, 10MP</p></td><td  ><p>10MP, 10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Camera</strong></p></td><td  ><p>200MP wide, 50MP ultra-wide, 10MP telephoto (3x optical)</p></td><td  ><p>200MP wide, 12MP ultra-wide, 10MP telephoto ( 3x opticazoom)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>4,400 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired, 20W wireless</p></td><td  ><p>25W wired, 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.16 inches) unfolded</p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.17 inches) unfolded</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>215 grams (7.5 ounces)</p></td><td  ><p>215 grams (7.5 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP48</p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p>Colors</p></td><td  ><p>Violet shadow, Cream, Graphite, Violet Green (online exclusive)</p></td><td  ><p>Blue Shadow, Silver Shadow, Jet-black, Mint</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-price-availability"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Price & availability</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3328px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="T6UGidvhwk5Am5sBqHvBVS" name="Z Fold 8 Ultra vs Z Fold 7-8" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/T6UGidvhwk5Am5sBqHvBVS-1920-80.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>The Samsung Galaxy Z Fold 7 has been on sale since last July, with prices starting at $1,999 for a model with 12GB of RAM and 256GB of storage. 512GB is available for $2,199, while a 1TB model with 16GB of RAM can be purchased for $2,499. </p><p>Color options include Silver Shadow, Jet Black, Blue Shadow and the Samsung-exclusive Mint. This phone is also likely to be discounted in the wake of the Z 8 series launch, since it's already a year old.</p><p>The Samsung Galaxy Z Fold 8 Ultra goes on sale on August 7, with prices starting at $2,199 for a model with 12GB of RAM and 256GB storage. 512GB raises the price to $2,299, while 1TB with 16GB of RAM will set you back $2,699.</p><p>Color options include Violet Shadow, Cream, Graphite and the Samsung-exclusive Green Shadow.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-design-and-display"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Design and Display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="TWaz6ndtJJBBsfEpVDj2cS" name="Z Fold 8 Ultra vs Z Fold 7-2" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/TWaz6ndtJJBBsfEpVDj2cS-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Samsung didn't offer any bold redesigns with the Z Fold 8 Ultra, and the new foldable's shape and size is more or less identical to the Galaxy Z Fold 7. They're not quite the same, since Z Fold 7 cases don't appear to fit on the back of the 8 Ultra, but it's close enough that you'd need precise measuring tools to notice.</p><p>The biggest upgrade is that the Z Fold 8 Ultra features a new <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex Titanium display</a>, which offers improved durability and significantly less creasing in the middle. <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one">It's not quite crease-free</a>, but it is almost invisible compared to the Z Fold 7. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2417px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="xYL3dLrXaNVRNg92GfxqsR" name="Z Fold 8 Ultra vs Z Fold 7-4" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/xYL3dLrXaNVRNg92GfxqsR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2417" height="1360" attribution="" endorsement="" 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 Fold 8 Ultra also has a much better screen when it comes to dealing with bright light. Both phones have the same high resolution screens and adaptive 1-120Hz refresh rates, but the Z Fold 7 isn't nearly as bright as the 8 Ultra. In fact, last year's foldable recorded a peak brightness of 2,245 nits, while the Z Fold 8 Ultra hit 2,687 nits. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@mspoonyg/video/7666429528071294222" data-video-id="7666429528071294222" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@mspoonyg" href="https://www.tiktok.com/@mspoonyg">@mspoonyg</a>                            <p></p><a target="_blank" title="♬ Thank You for Sunshine - House Duduk Music" href="https://www.tiktok.com/music/Thank-You-for-Sunshine-7650727836295612417">♬ Thank You for Sunshine - House Duduk Music</a></section>                    </blockquote></div>                <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing">anti-reflective coating on the newer foldable</a> also makes it a lot easier to use the Fold 8 Ultra in bright conditions, and it makes a shocking amount of difference in reducing glare. By which I mean you won't see your own silhouette staring back at you nearly as much.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-performance"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2891px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="xqV8DFuJtvGXYn6VEmv86S" name="Z Fold 8 Ultra vs Z Fold 7-9" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/xqV8DFuJtvGXYn6VEmv86S-1920-80.jpg" mos="" align="middle" fullscreen="" width="2891" height="1626" attribution="" endorsement="" 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 Galaxy Z Fold 8 Ultra is the first Galaxy foldable to feature the custom "for Galaxy" chipset, which means it shares the same <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-performance-face-off-snapdragon-8-elite-gen-5-vs-exynos-2600">Snapdragon 8 Elite Gen 5 for Galaxy chipset</a> as the Galaxy S26 series. Older foldables utilized Snapdragon's standard flagship chip, so the Z Fold 7 arrived running the same Snapdragon 8 Elite as countless other non-Samsung phones.</p><p>While the off-the-shelf chip is no slouch, the upgrade to a For Galaxy chipset means that the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-benchmarked-the-results-are-in">Z Fold 8 Ultra gets to enjoy a performance boost</a> compared to its predecessor.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench (Single/Multicore)</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>3,733/11,457</p></td><td  ><p>49.24/12,950</p></td><td  ><p>71715</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>3,052/9,735</p></td><td  ><p>41.21/10,812</p></td><td  ><p>61299</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>3,785 / 11,563</p></td><td  ><p>49.37 / 12,984</p></td><td  ><p>83047 (TensorFlow Lite QNN)</p></td></tr></tbody></table></div><p>As you can see in the table above, the Z Fold 8 Ultra finished Geekbench 6 with a single-core score of 3,733 and a multi-core score of 11,457. That's compared to the 3,052 and 9,735 scores recorded by the Z Fold 7 during the same benchmarking test. That's quite the jump, especially on the multi-core testing.</p><p>Graphics performance is a pretty similar story, with the Z Fold 8 Ultra scoring 12,950 in 3DMark's Solar Bay Unlimited benchmark test, with an average framerate of 49.24 fps. The Z Fold 7 came out with 10,912 and 41.21 fps which, while not terrible performance, seriously lags behind. Geekbench's AI test is more of the same with the Z Fold 8 Ultra coming in with a score of 71,715 to the Z Fold 7's 59,663.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-cameras"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3519px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="WcYimQVpPWYAFuWxKQJdES" name="Z Fold 8 Ultra vs Z Fold 7-6" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/WcYimQVpPWYAFuWxKQJdES-1920-80.jpg" mos="" align="middle" fullscreen="" width="3519" height="1979" attribution="" endorsement="" 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 camera situation on the Galaxy Z Fold 8 Ultra is a little hit and miss, though the same is true of the Z Fold 7. Both phones share the same 200MP main camera lens, 10MP telephoto lens with 3x optical zoom and a pair of 10MP selfie cameras (one for each screen). </p><p>However, the 8 Ultra's ultrawide camera has been given a much-needed update, increasing the resolution to 50MP — among smaller changes. But saying the phones both have similar camera hardware doesn't really tell us how different the photos actually are — especially now that software plays such a huge part in the process.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=2c06f5cc-90f5-11f1-ba1b-0e6f42328d7d"></iframe><p>You'd think that the quality of the 200MP main lens would be identical across both phones, but that actually isn't the case. They seem alike at first glance, but the Z Fold 8 Ultra is actually picking up a lot more detail compared to its predecessor. </p><p>The text on this mail box is a lot more legible, and the finer details in the brickwork stand out a lot more. Overall, the Fold 8 Ultra delivers a much clearer and crisper image.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=17b020c6-90f5-11f1-ba1b-0e6f42328d7d"></iframe><p>Despite the big bump in resolution, the difference in the ultrawide shots are pretty subtle — just as they were when I tested the cameras for the Galaxy Z Fold 8 Ultra review. The Z Fold 8 Ultra offers crisper image quality and a slightly brighter photo overall. At a glance, most won't be able to pick up the subtleties of how the two cameras are different.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=40a85188-90f5-11f1-ba1b-0e6f42328d7d"></iframe><p>Macro shots aren't that dissimilar either, and both phones are able to capture the smaller details from close-up shots. However, the Z Fold 7's shot is noticeably more washed out, and doesn't feature the same deeper coloring of the Z Fold 8 Ultra.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=e8c3cc5e-90f4-11f1-ba1b-0e6f42328d7d"></iframe><p>The selfie camera quality is more or less identical on both phones. Some areas are clearer than others, depending on which side you're looking at, but that seems to be due to the variations on focus rather than the actual quality of the final shot. The Z Fold 8 Ultra is a little bit brighter, though.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=cfc2f298-90f4-11f1-ba1b-0e6f42328d7d"></iframe><p>Portrait mode is exactly the same, with the exact same focus variations and brightness difference as the regular selfie mode. Neither photo has any particular characteristics that make it superior to the other, and the bokeh effect looks exactly the same across both devices.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=7fe0a734-90f4-11f1-ba1b-0e6f42328d7d"></iframe><p>Speaking of identical, the same is true of the telephoto lens at 3x optical zoom. The quality of the shot on both phones is pretty poor, and it's an upgrade Samsung desperately needs to make ahead of the Z Fold 9 launch next year.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=afe785b0-90f4-11f1-ba1b-0e6f42328d7d"></iframe><p>Pushing the magnification up to 10x doesn't make any difference either. While the details are being picked up by the camera, the actual quality of the final shot is atrocious compared to other flagship phones that cost considerably less money — including Samsung's own Galaxy S26 Ultra.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=00141e9a-90f5-11f1-ba1b-0e6f42328d7d"></iframe><p>Samsung made a point of emphasizing how much it was improving low light capabilities with the Z Fold 8 Ultra, and it definitely looks like it's succeeded. Compared to the Z Fold 7, the night-time shots are brighter, crisper and pick up a lot more detail from the mail box. In fact, the Z Fold 7 shot blurs out the letters V and R around the crown at the top</p><p>Samsung has clearly made some improvements to the Galaxy Z Fold 8 Ultra, especially where low light photography is concerned. But a lot of the daytime upgrades seem to be a lot more subtle, and less noticeable to the casual observer. Whether that minor boost is worth it for you all depends on which phone you have, and whether the Z Fold 8 Ultra's other upgrades matter to you or not.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-battery-charging"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Battery & charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3531px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="imtV2afR8StvoQEVHJmnSS" name="Z Fold 8 Ultra vs Z Fold 7-10" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/imtV2afR8StvoQEVHJmnSS-1920-80.jpg" mos="" align="middle" fullscreen="" width="3531" height="1986" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One of the biggest upgrades on the Galaxy Z Fold 8 Ultra is the fact that the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off">battery life is so much better now</a>. This is thanks to a higher capacity silicon carbon battery with 5,000 mAh capacity, compared to 4,400 mAh for the Fold 7. Our custom battery test, which involves web-surfing over a 5G connection until the power runs out, clocked the Z Fold 8 Ultra's battery life at 14 hours and 33 minutes.</p><p>While this isn't as good as the Galaxy S26 Ultra, it is almost four hours longer than the Galaxy Z Fold 7's 10 hours and 44 minutes of battery life. Under 11 hours is pretty disappointing, but hitting 14+ hours means the Z Fold 8 Ultra is far more likely to make it through a single day without recharging.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Hours : Minutes</strong></p></td><td  ><p><strong>Charging % in 30 minutes</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>14:33</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>10:44</p></td><td  ><p>54%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>16:10</p></td><td  ><p>77%</p></td></tr></tbody></table></div><p>The Z Fold 8 Ultra offers 45W wired charging compared to the Z Fold 7's 25W. That faster charging allows the phone to reclaim 76% of its battery life in just 30 minutes, compared to 54% on the Z Fold 7. Wireless charging has also increased by 5W, with up to 20W Qi2 speeds on the Z Fold 8 Ultra — though the embedded magnets are still missing from the phone.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-vs-samsung-galaxy-z-fold-7-verdict"><span>Samsung Galaxy Z Fold 8 Ultra vs Samsung Galaxy Z Fold 7: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3187px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="ibSFwbJGnJU62HeZzyCu4S" name="Z Fold 8 Ultra vs Z Fold 7-LIST" alt="samsung galaxy z fold 7 and galaxy z fold 8 ultra" src="https://cdn.mos.cms.futurecdn.net/ibSFwbJGnJU62HeZzyCu4S-1920-80.jpg" mos="" align="middle" fullscreen="" width="3187" height="1793" attribution="" endorsement="" 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 Samsung Galaxy Z Fold 8 Ultra has a lot of upgrades compared to last year, and the majority of them are available in areas that actually matter to your everyday use of the phone. Battery life is significantly improved, performance has taken a pretty big jump and the bright, anti-reflective display makes it significantly nicer to use this phone in a variety of conditions. </p><p>Those are all notable quality of life improvements that could make the Z Fold 8 Ultra the foldable of choice for most people. The camera changes are subtle, with the biggest difference being low-light performance.</p><p>Overall. the Fold 7 is still a very good foldable, especially when you can find it for a sizable discount. But if you're in the market for a new foldable phone, the Fold 8 Ultra is hands-down the better option.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade">I just tried the new Samsung DeX on the Galaxy Z Fold 8 — and it has one huge upgrade</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/3-big-ways-the-iphone-ultra-could-beat-the-galaxy-z-fold-8">iPhone Ultra vs Galaxy Z Fold 8 — here's 3 big ways Apple could win</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200">I tested the Galaxy Z Fold 8 vs. Fold 8 Ultra to see if the lack of a telephoto zoom is a dealbreaker</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Galaxy Z Fold 8 deals are here: how to save up $1,200 on Samsung's new foldables ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra are officially available for purchase. Samsung's new phones are among the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> we've tested, but they're also some one of the priciest. The Galaxy Z Fold 8 starts at $1,899, whereas the Galaxy Z Fold 8 Ultra starts at $2,099.</p><p>The good news is that there are plenty of Galaxy Z Fold 8 deals you can get right now on both phones. For example, you can get <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">up to $1,900 off either phone at T-Mobile</a> with trade-in and an eligible data plan. Alternatively, you can get <a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow">up to $1,200 off the Galaxy Z Fold 8 Ultra at Samsung</a> with trade-in. Or you'll get the same <a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow">$200 Samsung credit</a> without a trade. </p><p>Below I've rounded up all of the best Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra deals you can get. (For more ways to save, check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> hub).</p><h3 class="article-body__section" id="section-quick-links-galaxy-z-fold-8"><span>Quick Links: Galaxy Z Fold 8</span></h3><ul><li><strong>T-Mobile: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>free w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Samsung: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in or $200 credit</strong></a></li><li><strong>AT&T: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8.html" target="_blank" rel="nofollow"><strong>free w/ trade-in + unlimited</strong></a></li><li><strong>Verizon: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow"><strong>free w/ trade-in or free watch + tablet</strong></a></li><li><strong>Xfinity Mobile: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8" target="_blank" rel="nofollow"><strong>up to $1,000 off w/ trade-in + unlimited</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in + $200 gift card</strong></a><strong></strong></li><li><strong>Amazon: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12M2TY4" target="_blank" rel="nofollow"><strong>$1,899 + $350 gift card</strong></a></li></ul><h3 class="article-body__section" id="section-quick-links-galaxy-z-fold-8-ultra"><span>Quick Links: Galaxy Z Fold 8 Ultra</span></h3><ul><li><strong>T-Mobile: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>up to $1,900 w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Samsung: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in or $200 credit</strong></a></li><li><strong>AT&T: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8-ultra.html" target="_blank" rel="nofollow"><strong>$5/month w/ trade-in + unlimited</strong></a></li><li><strong>Verizon: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?isMyPlanFlow=true" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in or free watch + tablet</strong></a></li><li><strong>Xfinity Mobile: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8-ultra" target="_blank" rel="nofollow"><strong>up to $1,000 off w/ trade-in + unlimited</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in + $200 gift card</strong></a><strong></strong></li><li><strong>Amazon: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12KX1X4" target="_blank" rel="nofollow"><strong>$1,899 + $350 gift card</strong></a></li></ul><h3 class="article-body__section" id="section-galaxy-z-fold-8-deals"><span>Galaxy Z Fold 8 deals</span></h3><div class="product"><a data-dimension112="41449426-8f79-11f1-ac6a-cd8e71eb7761" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="41449426-8f79-11f1-ac6a-cd8e71eb7761" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>free w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get the Galaxy Z Fold 8 for free with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="41449426-8f79-11f1-ac6a-cd8e71eb7761" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449494-8f79-11f1-a3b3-034c75c466ef" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1312px;"><p class="vanilla-image-block" style="padding-top:55.95%;"><img id="YFnsbuxZypxrkdepxUH3h9" name="Samsung logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1312" height="734" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="41449494-8f79-11f1-a3b3-034c75c466ef" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8 hands-on</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but you get a greatly reduced crease, brighter main screen, and lighter design.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="41449494-8f79-11f1-a3b3-034c75c466ef" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449502-8f79-11f1-874d-61a515c7a389" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:225px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="o9PdShQsgAk95AN7C5UMNR" name="AT&T Logo.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o9PdShQsgAk95AN7C5UMNR-1920-80.jpeg" mos="" align="middle" fullscreen="" width="225" height="225" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8.html" target="_blank" rel="nofollow" data-dimension112="41449502-8f79-11f1-874d-61a515c7a389" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension25=""><strong>free w/ trade-in + unlimited @ AT&T</strong></a><br>New and existing customers can get the Galaxy Z Fold 8 for free when you trade in a phone with an eligible data plan. <a class="view-deal button" href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8.html" target="_blank" rel="nofollow" data-dimension112="41449502-8f79-11f1-874d-61a515c7a389" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449566-8f79-11f1-bd42-25fd978ef78f" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1331px;"><p class="vanilla-image-block" style="padding-top:68.52%;"><img id="yjsgCbZzcWDLMuhHtLHa7K" name="Best Buy deal block 2022.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yjsgCbZzcWDLMuhHtLHa7K-1920-80.jpeg" mos="" align="middle" fullscreen="" width="1331" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="41449566-8f79-11f1-bd42-25fd978ef78f" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension25=""><strong>up to $1,200 off + free $200 GC @ Best Buy</strong></a><br>Best Buy is offering one of the best Galaxy Z Fold 8 deals around. Purchase your phone at Best Buy with trade-in and you'll get up to $1,200 off. Plus, you'll get a free $200 Best Buy gift card. <a class="view-deal button" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="41449566-8f79-11f1-bd42-25fd978ef78f" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="414495d4-8f79-11f1-abf6-3dcb3004637c" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3321px;"><p class="vanilla-image-block" style="padding-top:40.98%;"><img id="R4vXmWQKAkSdQs7bVstjs8" name="Verizon logo 2024.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R4vXmWQKAkSdQs7bVstjs8-1920-80.jpg" mos="" align="middle" fullscreen="" width="3321" height="1361" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="414495d4-8f79-11f1-abf6-3dcb3004637c" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25=""><strong>up to $1,200 off w/ trade-in + unlimited @ Verizon</strong></a><br>Verizon is taking up to $1,200 off your Galaxy Z Fold 8 purchase with trade-in and eligible unlimited data plans. Or buy a Galaxy Fold 8 and get a free Galaxy Watch 9 and Galaxy Tab 10 FE 5G when you open a new line for each device. <a class="view-deal button" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="414495d4-8f79-11f1-abf6-3dcb3004637c" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449660-8f79-11f1-bbc7-7fb18b0f86de" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:300px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="NCwubcuyQYEeAmGJjMxYde" name="xfinitymobile-logo.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NCwubcuyQYEeAmGJjMxYde-1920-80.jpeg" mos="" align="middle" fullscreen="" width="300" height="300" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8" target="_blank" rel="nofollow" data-dimension112="41449660-8f79-11f1-bbc7-7fb18b0f86de" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension25=""><strong>up to $1,000 off w/ trade-in @ Xfinity Mobile</strong></a><br>Xfinity Mobile is offering up to $1,000 off the Galaxy Z Fold 8 (via trade-in). Customers who don't have a phone to trade can still get $600 off. <a class="view-deal button" href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8" target="_blank" rel="nofollow" data-dimension112="41449660-8f79-11f1-bbc7-7fb18b0f86de" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="414497d2-8f79-11f1-9643-f9639a8eb9cb" data-action="Deal Block" data-label="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension48="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12M2TY4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Samsung Galaxy Z Fold 8: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="414497d2-8f79-11f1-9643-f9639a8eb9cb" data-action="Deal Block" data-label="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension48="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension25=""><strong>for $1,899 @ Amazon</strong></a><br>Amazon is offering a free $350 Amazon gift card when you buy your Galaxy Z Fold 8 at Amazon. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="414497d2-8f79-11f1-9643-f9639a8eb9cb" data-action="Deal Block" data-label="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension48="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-preorder-deals"><span>Galaxy Z Fold 8 Ultra preorder deals</span></h3><div class="product"><a data-dimension112="41449912-8f79-11f1-a0c4-f3d8c7aa50af" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="41449912-8f79-11f1-a0c4-f3d8c7aa50af" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,900 off w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get up to $1,900 off the Galaxy Z Fold 8 Ultra with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="41449912-8f79-11f1-a0c4-f3d8c7aa50af" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449980-8f79-11f1-80b7-b1abdaa2cb44" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1312px;"><p class="vanilla-image-block" style="padding-top:55.95%;"><img id="YFnsbuxZypxrkdepxUH3h9" name="Samsung logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1312" height="734" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="41449980-8f79-11f1-80b7-b1abdaa2cb44" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 Ultra purchases when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 8-inch AMOLED (2504 x 2256) 120Hz main display, 6.5-inch AMOLED (1080 x 2520) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 200MP main wide-angle lens, 50MP ultra-wide lens, and 10MP telephoto lens (3x optical). Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="41449980-8f79-11f1-80b7-b1abdaa2cb44" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="414499e4-8f79-11f1-a71f-9328405cf2c4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1331px;"><p class="vanilla-image-block" style="padding-top:68.52%;"><img id="yjsgCbZzcWDLMuhHtLHa7K" name="Best Buy deal block 2022.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yjsgCbZzcWDLMuhHtLHa7K-1920-80.jpeg" mos="" align="middle" fullscreen="" width="1331" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="414499e4-8f79-11f1-a71f-9328405cf2c4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension25=""><strong>up to $1,200 off + free $200 GC @ Best Buy</strong></a><br>Best Buy is offering one of the best Galaxy Z Fold 8 Ultra deals around. Buy your phone at Best Buy with trade-in and you'll get up to $1,200 off. Plus, you'll get a free $200 Best Buy gift card just for your purchase. <a class="view-deal button" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="414499e4-8f79-11f1-a71f-9328405cf2c4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449a48-8f79-11f1-9a8d-5137f7f6511a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8-ultra.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:225px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="o9PdShQsgAk95AN7C5UMNR" name="AT&T Logo.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o9PdShQsgAk95AN7C5UMNR-1920-80.jpeg" mos="" align="middle" fullscreen="" width="225" height="225" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8-ultra.html" target="_blank" rel="nofollow" data-dimension112="41449a48-8f79-11f1-9a8d-5137f7f6511a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension25=""><strong>$5/month w/ trade-in + unlimited @ AT&T</strong></a><br>New and existing customers can get the Galaxy Z Fold 8 Ultra for $5.56/month when you trade in a phone with an eligible data plan. That's up to $1,900 off the phone's full price. <a class="view-deal button" href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8-ultra.html" target="_blank" rel="nofollow" data-dimension112="41449a48-8f79-11f1-9a8d-5137f7f6511a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449ab6-8f79-11f1-a62d-9f00e4deca92" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3321px;"><p class="vanilla-image-block" style="padding-top:40.98%;"><img id="R4vXmWQKAkSdQs7bVstjs8" name="Verizon logo 2024.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R4vXmWQKAkSdQs7bVstjs8-1920-80.jpg" mos="" align="middle" fullscreen="" width="3321" height="1361" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="41449ab6-8f79-11f1-a62d-9f00e4deca92" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25=""><strong>up to $1,200 off w/ trade-in + unlimited @ Verizon</strong></a><br>Verizon is taking up to $1,200 off your Galaxy Z Fold 8 Ultra  with trade-in and eligible unlimited data plans. Or buy a Galaxy Fold 8 Ultra and get a free Galaxy Watch 9 and Galaxy Tab 10 FE 5G when you open a new line for each device. <a class="view-deal button" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="41449ab6-8f79-11f1-a62d-9f00e4deca92" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449b24-8f79-11f1-a28e-f1483432e178" data-action="Deal Block" data-label="Z Fold 8 Ultra" data-dimension48="Z Fold 8 Ultra" data-dimension25="$2099" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12KX1X4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Amazon is offering a free $350 Amazon gift card when you buy your Galaxy Z Fold 8 Ultra at Amazon. It's one of the most generous deals we've seen on the unlocked version of Samsung's foldable. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12KX1X4" target="_blank" rel="nofollow" data-dimension112="41449b24-8f79-11f1-a28e-f1483432e178" data-action="Deal Block" data-label="Z Fold 8 Ultra" data-dimension48="Z Fold 8 Ultra" data-dimension25="$2099">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/best-galaxy-z-fold-8-deals-and-galaxy-z-fold-8-ultra-sales</link>
                                                                            <description>
                            <![CDATA[ Samsung Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra deals are officially here. I've rounded up the best discounts, trade-in offers, and freebies at retailers and carriers alike. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">TrUAVRfePg8tVbzzGwL3dD</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/kGBrQMgLzjcqtKeGQ6v4dS-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 07 Aug 2026 12:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5-320-70.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more. He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac. &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/kGBrQMgLzjcqtKeGQ6v4dS-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 playing Spider-Man: Brand New Day Trailer with deal tag]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 playing Spider-Man: Brand New Day Trailer with deal tag]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 playing Spider-Man: Brand New Day Trailer with deal tag]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/kGBrQMgLzjcqtKeGQ6v4dS-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra are officially available for purchase. Samsung's new phones are among the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> we've tested, but they're also some one of the priciest. The Galaxy Z Fold 8 starts at $1,899, whereas the Galaxy Z Fold 8 Ultra starts at $2,099.</p><p>The good news is that there are plenty of Galaxy Z Fold 8 deals you can get right now on both phones. For example, you can get <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">up to $1,900 off either phone at T-Mobile</a> with trade-in and an eligible data plan. Alternatively, you can get <a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow">up to $1,200 off the Galaxy Z Fold 8 Ultra at Samsung</a> with trade-in. Or you'll get the same <a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow">$200 Samsung credit</a> without a trade. </p><p>Below I've rounded up all of the best Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra deals you can get. (For more ways to save, check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> hub).</p><h3 class="article-body__section" id="section-quick-links-galaxy-z-fold-8"><span>Quick Links: Galaxy Z Fold 8</span></h3><ul><li><strong>T-Mobile: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>free w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Samsung: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in or $200 credit</strong></a></li><li><strong>AT&T: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8.html" target="_blank" rel="nofollow"><strong>free w/ trade-in + unlimited</strong></a></li><li><strong>Verizon: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow"><strong>free w/ trade-in or free watch + tablet</strong></a></li><li><strong>Xfinity Mobile: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8" target="_blank" rel="nofollow"><strong>up to $1,000 off w/ trade-in + unlimited</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in + $200 gift card</strong></a><strong></strong></li><li><strong>Amazon: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12M2TY4" target="_blank" rel="nofollow"><strong>$1,899 + $350 gift card</strong></a></li></ul><h3 class="article-body__section" id="section-quick-links-galaxy-z-fold-8-ultra"><span>Quick Links: Galaxy Z Fold 8 Ultra</span></h3><ul><li><strong>T-Mobile: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>up to $1,900 w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Samsung: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in or $200 credit</strong></a></li><li><strong>AT&T: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8-ultra.html" target="_blank" rel="nofollow"><strong>$5/month w/ trade-in + unlimited</strong></a></li><li><strong>Verizon: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?isMyPlanFlow=true" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in or free watch + tablet</strong></a></li><li><strong>Xfinity Mobile: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8-ultra" target="_blank" rel="nofollow"><strong>up to $1,000 off w/ trade-in + unlimited</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in + $200 gift card</strong></a><strong></strong></li><li><strong>Amazon: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12KX1X4" target="_blank" rel="nofollow"><strong>$1,899 + $350 gift card</strong></a></li></ul><h3 class="article-body__section" id="section-galaxy-z-fold-8-deals"><span>Galaxy Z Fold 8 deals</span></h3><div class="product"><a data-dimension112="41449426-8f79-11f1-ac6a-cd8e71eb7761" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="41449426-8f79-11f1-ac6a-cd8e71eb7761" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>free w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get the Galaxy Z Fold 8 for free with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="41449426-8f79-11f1-ac6a-cd8e71eb7761" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449494-8f79-11f1-a3b3-034c75c466ef" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1312px;"><p class="vanilla-image-block" style="padding-top:55.95%;"><img id="YFnsbuxZypxrkdepxUH3h9" name="Samsung logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1312" height="734" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="41449494-8f79-11f1-a3b3-034c75c466ef" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8 hands-on</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but you get a greatly reduced crease, brighter main screen, and lighter design.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="41449494-8f79-11f1-a3b3-034c75c466ef" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449502-8f79-11f1-874d-61a515c7a389" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:225px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="o9PdShQsgAk95AN7C5UMNR" name="AT&T Logo.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o9PdShQsgAk95AN7C5UMNR-1920-80.jpeg" mos="" align="middle" fullscreen="" width="225" height="225" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8.html" target="_blank" rel="nofollow" data-dimension112="41449502-8f79-11f1-874d-61a515c7a389" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension25=""><strong>free w/ trade-in + unlimited @ AT&T</strong></a><br>New and existing customers can get the Galaxy Z Fold 8 for free when you trade in a phone with an eligible data plan. <a class="view-deal button" href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8.html" target="_blank" rel="nofollow" data-dimension112="41449502-8f79-11f1-874d-61a515c7a389" data-action="Deal Block" data-label="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8: free w/ trade-in + unlimited @ AT&amp;T" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449566-8f79-11f1-bd42-25fd978ef78f" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1331px;"><p class="vanilla-image-block" style="padding-top:68.52%;"><img id="yjsgCbZzcWDLMuhHtLHa7K" name="Best Buy deal block 2022.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yjsgCbZzcWDLMuhHtLHa7K-1920-80.jpeg" mos="" align="middle" fullscreen="" width="1331" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="41449566-8f79-11f1-bd42-25fd978ef78f" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension25=""><strong>up to $1,200 off + free $200 GC @ Best Buy</strong></a><br>Best Buy is offering one of the best Galaxy Z Fold 8 deals around. Purchase your phone at Best Buy with trade-in and you'll get up to $1,200 off. Plus, you'll get a free $200 Best Buy gift card. <a class="view-deal button" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="41449566-8f79-11f1-bd42-25fd978ef78f" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8: up to $1,200 off + free $200 GC @ Best Buy" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="414495d4-8f79-11f1-abf6-3dcb3004637c" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3321px;"><p class="vanilla-image-block" style="padding-top:40.98%;"><img id="R4vXmWQKAkSdQs7bVstjs8" name="Verizon logo 2024.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R4vXmWQKAkSdQs7bVstjs8-1920-80.jpg" mos="" align="middle" fullscreen="" width="3321" height="1361" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="414495d4-8f79-11f1-abf6-3dcb3004637c" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25=""><strong>up to $1,200 off w/ trade-in + unlimited @ Verizon</strong></a><br>Verizon is taking up to $1,200 off your Galaxy Z Fold 8 purchase with trade-in and eligible unlimited data plans. Or buy a Galaxy Fold 8 and get a free Galaxy Watch 9 and Galaxy Tab 10 FE 5G when you open a new line for each device. <a class="view-deal button" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="414495d4-8f79-11f1-abf6-3dcb3004637c" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449660-8f79-11f1-bbc7-7fb18b0f86de" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:300px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="NCwubcuyQYEeAmGJjMxYde" name="xfinitymobile-logo.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/NCwubcuyQYEeAmGJjMxYde-1920-80.jpeg" mos="" align="middle" fullscreen="" width="300" height="300" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8" target="_blank" rel="nofollow" data-dimension112="41449660-8f79-11f1-bbc7-7fb18b0f86de" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension25=""><strong>up to $1,000 off w/ trade-in @ Xfinity Mobile</strong></a><br>Xfinity Mobile is offering up to $1,000 off the Galaxy Z Fold 8 (via trade-in). Customers who don't have a phone to trade can still get $600 off. <a class="view-deal button" href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-fold8" target="_blank" rel="nofollow" data-dimension112="41449660-8f79-11f1-bbc7-7fb18b0f86de" data-action="Deal Block" data-label="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Fold 8: up to $1,000 off w/ trade-in @ Xfinity Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="414497d2-8f79-11f1-9643-f9639a8eb9cb" data-action="Deal Block" data-label="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension48="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12M2TY4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Samsung Galaxy Z Fold 8: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="414497d2-8f79-11f1-9643-f9639a8eb9cb" data-action="Deal Block" data-label="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension48="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension25=""><strong>for $1,899 @ Amazon</strong></a><br>Amazon is offering a free $350 Amazon gift card when you buy your Galaxy Z Fold 8 at Amazon. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12M2TY4" target="_blank" rel="nofollow" data-dimension112="414497d2-8f79-11f1-9643-f9639a8eb9cb" data-action="Deal Block" data-label="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension48="Samsung Galaxy Z Fold 8: for $1,899 @ Amazon" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-preorder-deals"><span>Galaxy Z Fold 8 Ultra preorder deals</span></h3><div class="product"><a data-dimension112="41449912-8f79-11f1-a0c4-f3d8c7aa50af" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="41449912-8f79-11f1-a0c4-f3d8c7aa50af" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,900 off w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get up to $1,900 off the Galaxy Z Fold 8 Ultra with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="41449912-8f79-11f1-a0c4-f3d8c7aa50af" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449980-8f79-11f1-80b7-b1abdaa2cb44" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1312px;"><p class="vanilla-image-block" style="padding-top:55.95%;"><img id="YFnsbuxZypxrkdepxUH3h9" name="Samsung logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1312" height="734" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="41449980-8f79-11f1-80b7-b1abdaa2cb44" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 Ultra purchases when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 8-inch AMOLED (2504 x 2256) 120Hz main display, 6.5-inch AMOLED (1080 x 2520) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 200MP main wide-angle lens, 50MP ultra-wide lens, and 10MP telephoto lens (3x optical). Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="41449980-8f79-11f1-80b7-b1abdaa2cb44" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="414499e4-8f79-11f1-a71f-9328405cf2c4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1331px;"><p class="vanilla-image-block" style="padding-top:68.52%;"><img id="yjsgCbZzcWDLMuhHtLHa7K" name="Best Buy deal block 2022.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yjsgCbZzcWDLMuhHtLHa7K-1920-80.jpeg" mos="" align="middle" fullscreen="" width="1331" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="414499e4-8f79-11f1-a71f-9328405cf2c4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension25=""><strong>up to $1,200 off + free $200 GC @ Best Buy</strong></a><br>Best Buy is offering one of the best Galaxy Z Fold 8 Ultra deals around. Buy your phone at Best Buy with trade-in and you'll get up to $1,200 off. Plus, you'll get a free $200 Best Buy gift card just for your purchase. <a class="view-deal button" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="414499e4-8f79-11f1-a71f-9328405cf2c4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off + free $200 GC @ Best Buy" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449a48-8f79-11f1-9a8d-5137f7f6511a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8-ultra.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:225px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="o9PdShQsgAk95AN7C5UMNR" name="AT&T Logo.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o9PdShQsgAk95AN7C5UMNR-1920-80.jpeg" mos="" align="middle" fullscreen="" width="225" height="225" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8-ultra.html" target="_blank" rel="nofollow" data-dimension112="41449a48-8f79-11f1-9a8d-5137f7f6511a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension25=""><strong>$5/month w/ trade-in + unlimited @ AT&T</strong></a><br>New and existing customers can get the Galaxy Z Fold 8 Ultra for $5.56/month when you trade in a phone with an eligible data plan. That's up to $1,900 off the phone's full price. <a class="view-deal button" href="https://www.att.com/buy/phones/samsung-galaxy-z-fold8-ultra.html" target="_blank" rel="nofollow" data-dimension112="41449a48-8f79-11f1-9a8d-5137f7f6511a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Fold 8 Ultra: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449ab6-8f79-11f1-a62d-9f00e4deca92" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3321px;"><p class="vanilla-image-block" style="padding-top:40.98%;"><img id="R4vXmWQKAkSdQs7bVstjs8" name="Verizon logo 2024.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R4vXmWQKAkSdQs7bVstjs8-1920-80.jpg" mos="" align="middle" fullscreen="" width="3321" height="1361" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="41449ab6-8f79-11f1-a62d-9f00e4deca92" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25=""><strong>up to $1,200 off w/ trade-in + unlimited @ Verizon</strong></a><br>Verizon is taking up to $1,200 off your Galaxy Z Fold 8 Ultra  with trade-in and eligible unlimited data plans. Or buy a Galaxy Fold 8 Ultra and get a free Galaxy Watch 9 and Galaxy Tab 10 FE 5G when you open a new line for each device. <a class="view-deal button" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="41449ab6-8f79-11f1-a62d-9f00e4deca92" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="41449b24-8f79-11f1-a28e-f1483432e178" data-action="Deal Block" data-label="Z Fold 8 Ultra" data-dimension48="Z Fold 8 Ultra" data-dimension25="$2099" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12KX1X4" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Amazon is offering a free $350 Amazon gift card when you buy your Galaxy Z Fold 8 Ultra at Amazon. It's one of the most generous deals we've seen on the unlocked version of Samsung's foldable. <a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12KX1X4" target="_blank" rel="nofollow" data-dimension112="41449b24-8f79-11f1-a28e-f1483432e178" data-action="Deal Block" data-label="Z Fold 8 Ultra" data-dimension48="Z Fold 8 Ultra" data-dimension25="$2099">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Samsung Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra for 2 weeks — here’s the one I’d buy  ]]></title>
                                                                                                <dc:content><![CDATA[ <p>What’s in a name? In the case of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>, the “Ultra” part is supposed to signal to buyers that Samsung’s flagship foldable is a higher tier of phone. And in many ways it is, from the super bright display with less of a crease to the silicon-carbon battery (a first for Samsung phones).</p><p>But at $2,099, is the Fold 8 Ultra truly an “Ultra” phone? I’ve been testing it for a couple weeks, and while there’s plenty of great upgrades, there are some ways the Fold 8 Ultra falls short of the $1,299 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>. After testing these two phones side by side, including taking lots of photos, here’s the one I'd buy.</p><h3 class="article-body__section" id="section-galaxy-fold-8-ultra-vs-galaxy-s26-ultra-specs-compared"><span>Galaxy Fold 8 Ultra vs Galaxy S26 Ultra: Specs Compared</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Starting Price</strong></p></td><td  ><p><strong>$1,299</strong> (256GB)</p></td><td  ><p><strong>$2,099</strong> (256GB)</p></td></tr><tr><td class="firstcol " ><p><strong>Form Factor</strong></p></td><td  ><p>Traditional Slab / Glass-and-Metal Sandwich</p></td><td  ><p>Dual-screen Foldable</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p><strong>6.9-inch</strong> Dynamic LTPO AMOLED 2X</p><p>• 1440 x 3120 px (QHD+)</p><p>• 120Hz adaptive refresh rate</p><p>• Privacy Display</p></td><td  ><p><strong>8.0-inch</strong> Dynamic LTPO AMOLED 2X (Inner)</p><p>• 2256 x 2504 px</p><p>• 120Hz adaptive refresh rate</p><p>• Anti-reflective coating</p></td></tr><tr><td class="firstcol " ><p><strong>Cover Display</strong></p></td><td  ><p>N/A</p></td><td  ><p><strong>6.5-inch</strong> Dynamic LTPO AMOLED 2X</p><p>• 1080 x 2520 px, 120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>163.6 x 78.1 x 7.9 mm</p></td><td  ><p><strong>Folded:</strong> 158.4 x 72.8 x 8.9 mm</p><p><strong>Unfolded:</strong> 158.4 x 143.2 x 4.1 mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>214 g</p></td><td  ><p>215 g</p></td></tr><tr><td class="firstcol " ><p><strong>RAM Options</strong></p></td><td  ><p>12 GB (256GB/512GB) / 16 GB (1TB)</p></td><td  ><p>12 GB (256GB/512GB) / 16 GB (1TB)</p></td></tr><tr><td class="firstcol " ><p><strong>Storage Options</strong></p></td><td  ><p>256 GB / 512 GB / 1 TB (UFS 4.0)</p></td><td  ><p>256 GB / 512 GB / 1 TB</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Qualcomm Snapdragon 8 Elite Gen 5</p></td><td  ><p>Qualcomm Snapdragon 8 Elite Gen 5</p></td></tr><tr><td class="firstcol " ><p><strong>Durability Rating</strong></p></td><td  ><p><strong>IP68</strong> (Dust-tight + 1.5m water)</p></td><td  ><p><strong>IP48</strong> (Particle protection >1mm + 1m water)</p></td></tr><tr><td class="firstcol " ><p><strong>S Pen Support</strong></p></td><td  ><p><strong>Yes</strong> (Built-in slot)</p></td><td  ><p><strong>No</strong> (Not supported)</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>• 200 MP Main (OIS)</p><p>• 50 MP Ultrawide</p><p>• 10 MP 3x Telephoto</p><p>• 50 MP 5x Periscope Zoom</p></td><td  ><p>• 200 MP Main (OIS)</p><p>• 50 MP Ultrawide</p><p>• 10 MP 3x Telephoto</p></td></tr><tr><td class="firstcol " ><p><strong>Zoom Range</strong></p></td><td  ><p>Up to 100x Space Zoom</p></td><td  ><p>Up to 30x Space Zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Cameras</strong></p></td><td  ><p>12 MP (Single)</p></td><td  ><p>10 MP Cover Screen + 10 MP Inner Display</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Capacity</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging Speeds</strong></p></td><td  ><p>60W Wired / 25W Wireless / 4.5W Reverse</p></td><td  ><p>45W Wired / 20W Wireless / 4.5W Reverse</p></td></tr><tr><td class="firstcol " ><p><strong>Operating System</strong></p></td><td  ><p>Android 16 (One UI 8.5)</p></td><td  ><p>Android 17 (One UI 9.0)</p></td></tr><tr><td class="firstcol " ><p><strong>Color Options</strong></p></td><td  ><p>Titanium Gray, Titanium Black, Titanium Silver, Titanium Violet</p></td><td  ><p>Graphite, Cream, Violet Shadow, Green Shadow (Samsung Online Exclusive)</p></td></tr></tbody></table></div><div class="product"><a data-dimension112="e44b0efe-91d9-11f1-8044-8165f725d951" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" 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="XUkFwYXYpdYjL4TYYivxEg" name="Samsung Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XUkFwYXYpdYjL4TYYivxEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="e44b0efe-91d9-11f1-8044-8165f725d951" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>The Galaxy Z Fold 8 Ultra features an 8-inch main display, 6.5-inch cover display and triple camera setup that includes a 200MP main, 50MP ultra-wide, and 10MP 3x telephoto lens. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a great upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="e44b0efe-91d9-11f1-8044-8165f725d951" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="62e34dc6-91da-11f1-bb9e-2bbcd957c9c7" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1049" href="https://www.bestbuy.com/product/samsung-galaxy-s26-ultra-256gb-unlocked-cobalt-violet/JJGRF36YJC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1475px;"><p class="vanilla-image-block" style="padding-top:101.69%;"><img id="pTo28Fx9tATQs3gfbYBFL5" name="Galaxy S26 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pTo28Fx9tATQs3gfbYBFL5-1920-80.jpg" mos="" align="middle" fullscreen="" width="1475" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy S26 Ultra features a 6.9-inch 3120 x 1440 AMOLED display w/ 120Hz refresh, Snapdragon 8 Elite Gen 5 CPU, 12GB of RAM, and 256GB of storage. You also get a 200MP main (f/1.4), 50MP ultra wide (f/1.9), 10MP (f/2.4) telephoto w/3x optical zoom, and a 50MP (f/2.9) telephoto w/5x optical zoom. There's also a 5,000 mAh battery. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review" data-dimension112="62e34dc6-91da-11f1-bb9e-2bbcd957c9c7" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1049">Galaxy S26 Ultra review</a>, we said the Editor's Choice phone is super smart, sleek and fast. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-s26-ultra-256gb-unlocked-cobalt-violet/JJGRF36YJC" target="_blank" rel="nofollow" data-dimension112="62e34dc6-91da-11f1-bb9e-2bbcd957c9c7" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1049">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-design-and-durability"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Design and durability</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:2801px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="wVVitwh992iiUo4GDVZM7F" name="Galaxy Z Fold 8 Ultra review-22" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/wVVitwh992iiUo4GDVZM7F-1920-80.jpg" mos="" align="middle" fullscreen="" width="2801" height="1576" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy Z Fold 8 Ultra </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 Ultra is remarkably light and compact for a phone that unfurls to an 8-inch display. It weighs just 7.58 ounces, which is barely heavier than the Galaxy S26 Ultra that limits you to a 6.9-inch screen.</p><p>In addition, the Fold 8 Ultra is only 4.1mm thin when it’s opened, which is even thinner than the Fold 7. Still, when closed the Galaxy S26 Ultra is a millimeter thinner, which is expected for a slab phone.</p><div ><table><caption>Galaxy Z Fold 8 Ultra vs. S26 Ultra: Size and weight</caption><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>State</strong></p></td><td  ><p><strong>Dimensions (H × W × D)</strong></p></td><td  ><p><strong>Weight</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p><strong>Unfolded (Open)</strong></p></td><td  ><p>6.24 × 5.64 × 0.16 in (158.4 × 143.2 × 4.1 mm)</p></td><td  ><p>7.58 oz (215 g)</p></td></tr><tr><td class="firstcol empty" ></td><td  ><p><strong>Folded (Closed)</strong></p></td><td  ><p>6.24 × 2.87 × 0.35 in (158.4 × 72.8 × 8.9 mm)</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 Ultra</strong></p></td><td  ><p><strong>Standard</strong></p></td><td  ><p>6.44 × 3.07 × 0.31 in (163.6 × 78.1 × 7.9 mm)</p></td><td  ><p>7.55 oz (214 g)</p></td></tr></tbody></table></div><p>The Fold 8 Ultra may be thinner, but it’s definitely not ready for a day at the beach. This foldable is once again IP48 rated, which means it can withstand being submerged in water for 30 minutes — but it is not dust resistant.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3733px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="YpCNYCr6ACAQ2JPhGn3KuK" name="Galaxy S26 Ultra review-LIST2" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/YpCNYCr6ACAQ2JPhGn3KuK-1920-80.jpg" mos="" align="middle" fullscreen="" width="3733" height="2100" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, the Galaxy S26 Ultra carries an IP68 rating, which means the phone is dust tight. It’s also worth mentioning that other foldables are rated IP68, including the Motorola Razr Fold and Google Pixel 10 Pro Fold.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-displays"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Displays</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:3462px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="s4PcUkqvHoinhjuVyNZ6gW" name="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra-2" alt="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra" src="https://cdn.mos.cms.futurecdn.net/s4PcUkqvHoinhjuVyNZ6gW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3462" height="1947" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Z Fold 8 packs dual screens: a 6.5-inch cover display that’s fine for running apps (if a bit cramped for typing) and a huge 8-inch main display. And the S26 Ultra has a 6.9-inch panel.</p><p>The main reason to get the Fold 8 Ultra is the bigger main display. With 8 inches at your disposal, you get a more immersive video watching experience, as well as the ability to run apps side by side.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iGEKAZXpueuG4YxyKtptrR" name="Fold 8 Ultra vs S26 Ultra displays" alt="Samsung Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra in hand" src="https://cdn.mos.cms.futurecdn.net/iGEKAZXpueuG4YxyKtptrR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>What you don’t get is the S26 Ultra’s Privacy Display, which narrows the viewing angle for any snoops around you and can even black out just parts of the display.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sY6mMGM5VbiNoDMrS3Gt4h" name="Galaxy S26 Ultra privacy screen LIST" alt="Samsung Galaxy S26 Ultra showing Privacy Display" src="https://cdn.mos.cms.futurecdn.net/sY6mMGM5VbiNoDMrS3Gt4h-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I really like that the Fold 8 Ultra features an anti-reflective coating that seriously cuts down on glare when you’re outside. Plus, thanks to Samsung’s Flex Titanium technology, the Galaxy Z Fold 8’s crease is much less visible than previous Samsung foldable phones. It’s still there, but more subtle.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Brightness HDR (nits)</strong></p></td><td  ><p><strong>Color (DCI-P3)</strong></p></td><td  ><p><strong>Accuracy (Delta-E)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold  Ultra</strong></p></td><td  ><p>2,687</p></td><td  ><p>116.6% (Natural)</p></td><td  ><p>0.2</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>1,806</p></td><td  ><p>90.6% (Natural)</p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>Thanks to a brighter screen, I also found using the Z Fold 8 outside in direct sunlight a lot easier, whether I was browsing the web or just taking or reviewing photos. On previous Samsung Folds, I mostly used the external screen for taking pics.</p><p>In our lab testing the Z Fold 8 Ultra hit 2,687 nits of brightness with HDR content. That’s considerably higher than the S26 Ultra’s 1,806 nits.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-s-pen"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: S Pen</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:4345px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AQBTHresRLkR56MSUmEFMM" name="Galaxy S26 Ultra review-17" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/AQBTHresRLkR56MSUmEFMM-1920-80.jpg" mos="" align="middle" fullscreen="" width="4345" height="2444" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung ditched the S Pen on the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a> in order to make a thinner design and it’s still missing on the Fold 8 Ultra. Without a built-in digitizer for the screen, you simply can’t use an S Pen.</p><p>Meanwhile, the S26 Ultra has an S Pen built into the design. So you can use the stylus for taking notes, drawing and making fine edits on the go. </p><p>I spoke to Samsung executives about the missing S Pen on the Fold and they’re <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">“open” to bringing it back</a>.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-cameras"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3441px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="TnA5425ZLKYYYgLYV3DJDG" name="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra-3" alt="Samsung Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra rear cameras" src="https://cdn.mos.cms.futurecdn.net/TnA5425ZLKYYYgLYV3DJDG-1920-80.jpg" mos="" align="middle" fullscreen="" width="3441" height="1936" attribution="" endorsement="" 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 Galaxy Z Fold 8 Ultra has an <em>Ultra-ish</em> camera setup, starting with a 200MP main camera and 50MP ultraside, same as on the Galaxy S26 Ultra. But the new foldable falls down in the zoom department.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/aepV355MZkiSHL9bNuGfBo-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ttHc5QQrF7xwUSmwWn8QBo-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/BKQv5NjgvAqWQGAzbbDNsi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Tbcsv6heCjtKjWPzdCbZsi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Let’s start with the good news. In most conditions, the main and ultrawide cameras on the Fold 8 and S26 Ultra turned in nearly identical results, whether it was flower close-up ultra-wide shots of Bryant Park or portraits. Panoramas were similar, too.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=b187e00e-91d0-11f1-ba1b-0e6f42328d7d"></iframe><p>It’s when you try to get in close that the Fold 8, well, folds. While the S26 Ultra packs dual telephoto zoom lenses at 3x and 5x with a maximum of 100x digital zoom, the Fold 8 Ultra has only a single 10MP telephoto lens with 3x optical zoom and 30x digital zoom.</p><p>Check out this close-up of an ice cream truck. At 30x, you can make out all of the menu names underneath the pictures of the cones on the S26 Ultra. On the Fold 8 Ultra it’s just a bunch of blobs.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=3ddb19aa-91d0-11f1-ba1b-0e6f42328d7d"></iframe><p>Same thing with this shot of a medieval scholar sculpture on the side of a New York City building. At 10x, you can make out more details in his face, hair and garb. And at 30x the Fold 8’s Ultra’s shot looks like an impressionist painting by comparison.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/uKqxNfpVJr8eBRAQFcvTFi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - 10x<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/KuTqZjwfj6Cj3esegBBuii-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra - 10x<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GdFLdXVo8dWBJ9L5eHYGxh-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - 30x<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iuHdLkoLEJZT8xfG94DUFi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra - 30x<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>The S26 Ultra has a slight selfie advantage, too, with a 12MP front camera. The Fold 8 Ultra has dual 10MP shooters. But the results are pretty close in my eyes. The advantage the Fold has is that you can flip around the cover display and take super sharp selfies with the rear cameras.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Qtm4PmZ2UEHeBpzsJ86rgi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - Main camera<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/e8xVg6WGnZz9BPZSEvcrni-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - Front camera<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2jRFCRn8ANYoQ8b5WJRcoi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>I’d say the Fold 8 Ultra and S26 Ultra are fairly evenly matched in low-light settings. In this photo of a record player in near darkness, the S26 Ultra delivered a brighter and crisper shot. The colors look more realistic too, especially in the pink macrame.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=d70c81d2-91cf-11f1-ba1b-0e6f42328d7d"></iframe><p>However, while the S26 Ultra gave me a brighter shot of the bottles in this bar, especially the blue Casa Azul, the text looks sharper through the Fold 8 Ultra.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=b8df2c0a-91cf-11f1-ba1b-0e6f42328d7d"></iframe><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-performance"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3684px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="bFv6s9UZuRZHPMckD5pxaL" name="Galaxy S26 Ultra review-27" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/bFv6s9UZuRZHPMckD5pxaL-1920-80.jpg" mos="" align="middle" fullscreen="" width="3684" height="2072" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy S26 Ultra </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Packing the same Snapdragon 8 Elite Gen 5 chip for Galaxy, the Galaxy Z Fold 8 Ultra and S26 Ultra are both multitasking powerhouses, and they’re both great for gaming.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yAdRaBVHZ6CPwD4QtQ3UxE" name="fold 8 ultra gaming" alt="Playing Wuthering Waves on Galaxy Z Fold 8 Ultra" src="https://cdn.mos.cms.futurecdn.net/yAdRaBVHZ6CPwD4QtQ3UxE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In our lab tests, the S26 Ultra finished slightly ahead in Geekbench, 3DMark graphics and Geekbench AI, but I wouldn’t say it’s a big difference.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench 6 (Single/Multicore)</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>3,110/10,578</p></td><td  ><p>49.24/12,950</p></td><td  ><p>71715</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>3,733/11,457</p></td><td  ><p>49.37 / 12,984</p></td><td  ><p>83047 </p></td></tr></tbody></table></div><p>The S26 Ultra could be helped by the fact that it has vapor chamber cooling, while the Fold 8 Ultra does not.</p><p>I played Wuthering Waves on both the Fold 8 Ultra and S26 Ultra, and it was more immersive on the Fold because of its large display. But I found it a touch smoother on the S26 Ultra.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-battery-life-and-charging"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Battery life and charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2907px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="w8dEoJdD9j97ChKpUrPWwF" name="Galaxy S26 Ultra review" alt="Samsung Galaxy S26 Ultra with 60W charger" src="https://cdn.mos.cms.futurecdn.net/w8dEoJdD9j97ChKpUrPWwF-1920-80.jpg" mos="" align="middle" fullscreen="" width="2907" height="1635" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung has made the leap to silicon-carbon battery tech with the Fold 8 Ultra, going from 4,400 mAh on the Fold 7 to 5,000 mAh on its latest foldable. That’s the same capacity as the S26 Ultra albeit with lithium ion.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Hours:Mins</strong></p></td><td  ><p><strong>15-min charge</strong></p></td><td  ><p><strong>30-min charge</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>14:33</p></td><td  ><p>49%</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>16:40 </p></td><td  ><p>41%</p></td><td  ><p>77%</p></td></tr></tbody></table></div><p>On the Tom’s Guide battery test, which involves continuous web surfing over 5G, the Galaxy Z Fold 8 Ultra lasted an impressive 14 hours and 33 minutes. That’s a huge upgrade over the 11 hours turned in by the Fold 7.</p><p>The Galaxy S26 Ultra lasted an even longer 16 hours and 40 minutes, but keep in mind that it was powering a smaller 6.9-inch display compared to the 8-inch screen on the Fold 8.</p><p>The Fold 8 offers 45W wired charging and 20W wireless charging, compared to 60W wired and 25W wireless on the S26 Ultra. But the phones turned in similar results in our wired charging test.</p><p>The Fold 8 Ultra got to 76% in 30 minutes versus 77% for the S26 Ultra. Note that neither phone has built-in magnets for Qi 2 charging, so you’ll have to buy a case with that feature.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-software-and-special-features"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Software and special features</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4592px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dSkYa6nb5vfELq9CZP9HkM" name="Galaxy S26 Ultra review-21" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/dSkYa6nb5vfELq9CZP9HkM-1920-80.jpg" mos="" align="middle" fullscreen="" width="4592" height="2583" attribution="" endorsement="" class="inline"></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 Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra offer a bunch of AI features that come in handy, including automated actions with Gemini (like helping to book dinner reservations or even vacations), Call Screening and Now Brief for summarizing your daily schedule. They also both let you transform your photos with a simple voice prompt.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3617px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="TFyBCFPuPGGHLrmtZ8NaYL" name="Galaxy S26 Ultra review-6" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/TFyBCFPuPGGHLrmtZ8NaYL-1920-80.jpg" mos="" align="middle" fullscreen="" width="3617" height="2035" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, the Fold 8 Ultra offers a few unique tricks of its own. This includes Now Nudge in Split View, which can give you quick hints for opening a second app on its own screen to save time. And My FanCam can automatically follow a subject in your video, cropping the clip on the fly.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FTAPbqnyMxnn72TGFVq4Eg" name="Galaxy Z Fold 8 Ultra-29" alt="Galaxy Z Fold 8 Ultra Flex Mode" src="https://cdn.mos.cms.futurecdn.net/FTAPbqnyMxnn72TGFVq4Eg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy Z Fold 8 Ultra Flex Mode </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Plus, unlike the Galaxy S26 Ultra, the Fold 8 Ultra boasts a Flex Mode for using the foldable like a mini laptop. And when shooting photos and videos you can use the Cover Screen preview feature to let the subjects see themselves in real time.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-verdict"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2046px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="nyEE9BKEyuBBNQFxKmYmcP" name="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra-4" alt="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra-4" src="https://cdn.mos.cms.futurecdn.net/nyEE9BKEyuBBNQFxKmYmcP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2046" height="1151" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’m not going to say that calling the Galaxy Z Fold 8 Ultra an Ultra phone is false advertising, but you do have to make a bunch of trade-offs versus the Galaxy S26 Ultra.</p><p>With the foldable you don’t get an S Pen or an IP68 rating for dust resistance, and the S26 Ultra offers both a more powerful telephoto zoom and Privacy Display feature. Plus, the S26 Ultra lasted longer on a charge.</p><p>However, the Galaxy Z Fold 8 Ultra is a very versatile foldable phone that grants you a much bigger display, the ability to run up three apps at once and handy AI tools like Now Nudge with Split View.</p><p>But at $2,099, the Fold 8 Ultra costs $800 more than the S26 Ultra. So you really, really want to own a foldable if you’re going that route. </p><p>Bottom line: If you want the ultimate multi-tasking powerhouse, get the Fold 8 Ultra. But if you want the biggest zoom, best-in-class privacy and an S Pen, snag the S26 Ultra for less.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra</link>
                                                                            <description>
                            <![CDATA[ I compared the Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra side by side in terms of design, durability, features and performance to help you pick the right flagship for you. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">pWm7apZ2eAGEG6QZmCkxgn</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/A6iyDHHwEjWBJKYW5FPrpW-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 07 Aug 2026 04:30:00 +0000</pubDate>                                                                                                                                <updated>Thu, 13 Aug 2026 11:25:19 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/A6iyDHHwEjWBJKYW5FPrpW-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/A6iyDHHwEjWBJKYW5FPrpW-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>What’s in a name? In the case of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>, the “Ultra” part is supposed to signal to buyers that Samsung’s flagship foldable is a higher tier of phone. And in many ways it is, from the super bright display with less of a crease to the silicon-carbon battery (a first for Samsung phones).</p><p>But at $2,099, is the Fold 8 Ultra truly an “Ultra” phone? I’ve been testing it for a couple weeks, and while there’s plenty of great upgrades, there are some ways the Fold 8 Ultra falls short of the $1,299 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>. After testing these two phones side by side, including taking lots of photos, here’s the one I'd buy.</p><h3 class="article-body__section" id="section-galaxy-fold-8-ultra-vs-galaxy-s26-ultra-specs-compared"><span>Galaxy Fold 8 Ultra vs Galaxy S26 Ultra: Specs Compared</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Starting Price</strong></p></td><td  ><p><strong>$1,299</strong> (256GB)</p></td><td  ><p><strong>$2,099</strong> (256GB)</p></td></tr><tr><td class="firstcol " ><p><strong>Form Factor</strong></p></td><td  ><p>Traditional Slab / Glass-and-Metal Sandwich</p></td><td  ><p>Dual-screen Foldable</p></td></tr><tr><td class="firstcol " ><p><strong>Main Display</strong></p></td><td  ><p><strong>6.9-inch</strong> Dynamic LTPO AMOLED 2X</p><p>• 1440 x 3120 px (QHD+)</p><p>• 120Hz adaptive refresh rate</p><p>• Privacy Display</p></td><td  ><p><strong>8.0-inch</strong> Dynamic LTPO AMOLED 2X (Inner)</p><p>• 2256 x 2504 px</p><p>• 120Hz adaptive refresh rate</p><p>• Anti-reflective coating</p></td></tr><tr><td class="firstcol " ><p><strong>Cover Display</strong></p></td><td  ><p>N/A</p></td><td  ><p><strong>6.5-inch</strong> Dynamic LTPO AMOLED 2X</p><p>• 1080 x 2520 px, 120Hz</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>163.6 x 78.1 x 7.9 mm</p></td><td  ><p><strong>Folded:</strong> 158.4 x 72.8 x 8.9 mm</p><p><strong>Unfolded:</strong> 158.4 x 143.2 x 4.1 mm</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>214 g</p></td><td  ><p>215 g</p></td></tr><tr><td class="firstcol " ><p><strong>RAM Options</strong></p></td><td  ><p>12 GB (256GB/512GB) / 16 GB (1TB)</p></td><td  ><p>12 GB (256GB/512GB) / 16 GB (1TB)</p></td></tr><tr><td class="firstcol " ><p><strong>Storage Options</strong></p></td><td  ><p>256 GB / 512 GB / 1 TB (UFS 4.0)</p></td><td  ><p>256 GB / 512 GB / 1 TB</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Qualcomm Snapdragon 8 Elite Gen 5</p></td><td  ><p>Qualcomm Snapdragon 8 Elite Gen 5</p></td></tr><tr><td class="firstcol " ><p><strong>Durability Rating</strong></p></td><td  ><p><strong>IP68</strong> (Dust-tight + 1.5m water)</p></td><td  ><p><strong>IP48</strong> (Particle protection >1mm + 1m water)</p></td></tr><tr><td class="firstcol " ><p><strong>S Pen Support</strong></p></td><td  ><p><strong>Yes</strong> (Built-in slot)</p></td><td  ><p><strong>No</strong> (Not supported)</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong></p></td><td  ><p>• 200 MP Main (OIS)</p><p>• 50 MP Ultrawide</p><p>• 10 MP 3x Telephoto</p><p>• 50 MP 5x Periscope Zoom</p></td><td  ><p>• 200 MP Main (OIS)</p><p>• 50 MP Ultrawide</p><p>• 10 MP 3x Telephoto</p></td></tr><tr><td class="firstcol " ><p><strong>Zoom Range</strong></p></td><td  ><p>Up to 100x Space Zoom</p></td><td  ><p>Up to 30x Space Zoom</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Cameras</strong></p></td><td  ><p>12 MP (Single)</p></td><td  ><p>10 MP Cover Screen + 10 MP Inner Display</p></td></tr><tr><td class="firstcol " ><p><strong>Battery Capacity</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging Speeds</strong></p></td><td  ><p>60W Wired / 25W Wireless / 4.5W Reverse</p></td><td  ><p>45W Wired / 20W Wireless / 4.5W Reverse</p></td></tr><tr><td class="firstcol " ><p><strong>Operating System</strong></p></td><td  ><p>Android 16 (One UI 8.5)</p></td><td  ><p>Android 17 (One UI 9.0)</p></td></tr><tr><td class="firstcol " ><p><strong>Color Options</strong></p></td><td  ><p>Titanium Gray, Titanium Black, Titanium Silver, Titanium Violet</p></td><td  ><p>Graphite, Cream, Violet Shadow, Green Shadow (Samsung Online Exclusive)</p></td></tr></tbody></table></div><div class="product"><a data-dimension112="e44b0efe-91d9-11f1-8044-8165f725d951" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" 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="XUkFwYXYpdYjL4TYYivxEg" name="Samsung Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XUkFwYXYpdYjL4TYYivxEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="e44b0efe-91d9-11f1-8044-8165f725d951" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>The Galaxy Z Fold 8 Ultra features an 8-inch main display, 6.5-inch cover display and triple camera setup that includes a 200MP main, 50MP ultra-wide, and 10MP 3x telephoto lens. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a great upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="e44b0efe-91d9-11f1-8044-8165f725d951" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="62e34dc6-91da-11f1-bb9e-2bbcd957c9c7" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1049" href="https://www.bestbuy.com/product/samsung-galaxy-s26-ultra-256gb-unlocked-cobalt-violet/JJGRF36YJC" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1475px;"><p class="vanilla-image-block" style="padding-top:101.69%;"><img id="pTo28Fx9tATQs3gfbYBFL5" name="Galaxy S26 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/pTo28Fx9tATQs3gfbYBFL5-1920-80.jpg" mos="" align="middle" fullscreen="" width="1475" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>The Galaxy S26 Ultra features a 6.9-inch 3120 x 1440 AMOLED display w/ 120Hz refresh, Snapdragon 8 Elite Gen 5 CPU, 12GB of RAM, and 256GB of storage. You also get a 200MP main (f/1.4), 50MP ultra wide (f/1.9), 10MP (f/2.4) telephoto w/3x optical zoom, and a 50MP (f/2.9) telephoto w/5x optical zoom. There's also a 5,000 mAh battery. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review" data-dimension112="62e34dc6-91da-11f1-bb9e-2bbcd957c9c7" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1049">Galaxy S26 Ultra review</a>, we said the Editor's Choice phone is super smart, sleek and fast. <a class="view-deal button" href="https://www.bestbuy.com/product/samsung-galaxy-s26-ultra-256gb-unlocked-cobalt-violet/JJGRF36YJC" target="_blank" rel="nofollow" data-dimension112="62e34dc6-91da-11f1-bb9e-2bbcd957c9c7" data-action="Deal Block" data-label="Galaxy S26 Ultra" data-dimension48="Galaxy S26 Ultra" data-dimension25="$1049">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-design-and-durability"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Design and durability</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:2801px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="wVVitwh992iiUo4GDVZM7F" name="Galaxy Z Fold 8 Ultra review-22" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/wVVitwh992iiUo4GDVZM7F-1920-80.jpg" mos="" align="middle" fullscreen="" width="2801" height="1576" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy Z Fold 8 Ultra </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 Ultra is remarkably light and compact for a phone that unfurls to an 8-inch display. It weighs just 7.58 ounces, which is barely heavier than the Galaxy S26 Ultra that limits you to a 6.9-inch screen.</p><p>In addition, the Fold 8 Ultra is only 4.1mm thin when it’s opened, which is even thinner than the Fold 7. Still, when closed the Galaxy S26 Ultra is a millimeter thinner, which is expected for a slab phone.</p><div ><table><caption>Galaxy Z Fold 8 Ultra vs. S26 Ultra: Size and weight</caption><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>State</strong></p></td><td  ><p><strong>Dimensions (H × W × D)</strong></p></td><td  ><p><strong>Weight</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p><strong>Unfolded (Open)</strong></p></td><td  ><p>6.24 × 5.64 × 0.16 in (158.4 × 143.2 × 4.1 mm)</p></td><td  ><p>7.58 oz (215 g)</p></td></tr><tr><td class="firstcol empty" ></td><td  ><p><strong>Folded (Closed)</strong></p></td><td  ><p>6.24 × 2.87 × 0.35 in (158.4 × 72.8 × 8.9 mm)</p></td><td  ></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 Ultra</strong></p></td><td  ><p><strong>Standard</strong></p></td><td  ><p>6.44 × 3.07 × 0.31 in (163.6 × 78.1 × 7.9 mm)</p></td><td  ><p>7.55 oz (214 g)</p></td></tr></tbody></table></div><p>The Fold 8 Ultra may be thinner, but it’s definitely not ready for a day at the beach. This foldable is once again IP48 rated, which means it can withstand being submerged in water for 30 minutes — but it is not dust resistant.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3733px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="YpCNYCr6ACAQ2JPhGn3KuK" name="Galaxy S26 Ultra review-LIST2" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/YpCNYCr6ACAQ2JPhGn3KuK-1920-80.jpg" mos="" align="middle" fullscreen="" width="3733" height="2100" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, the Galaxy S26 Ultra carries an IP68 rating, which means the phone is dust tight. It’s also worth mentioning that other foldables are rated IP68, including the Motorola Razr Fold and Google Pixel 10 Pro Fold.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-displays"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Displays</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:3462px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="s4PcUkqvHoinhjuVyNZ6gW" name="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra-2" alt="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra" src="https://cdn.mos.cms.futurecdn.net/s4PcUkqvHoinhjuVyNZ6gW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3462" height="1947" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Z Fold 8 packs dual screens: a 6.5-inch cover display that’s fine for running apps (if a bit cramped for typing) and a huge 8-inch main display. And the S26 Ultra has a 6.9-inch panel.</p><p>The main reason to get the Fold 8 Ultra is the bigger main display. With 8 inches at your disposal, you get a more immersive video watching experience, as well as the ability to run apps side by side.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iGEKAZXpueuG4YxyKtptrR" name="Fold 8 Ultra vs S26 Ultra displays" alt="Samsung Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra in hand" src="https://cdn.mos.cms.futurecdn.net/iGEKAZXpueuG4YxyKtptrR-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>What you don’t get is the S26 Ultra’s Privacy Display, which narrows the viewing angle for any snoops around you and can even black out just parts of the display.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="sY6mMGM5VbiNoDMrS3Gt4h" name="Galaxy S26 Ultra privacy screen LIST" alt="Samsung Galaxy S26 Ultra showing Privacy Display" src="https://cdn.mos.cms.futurecdn.net/sY6mMGM5VbiNoDMrS3Gt4h-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I really like that the Fold 8 Ultra features an anti-reflective coating that seriously cuts down on glare when you’re outside. Plus, thanks to Samsung’s Flex Titanium technology, the Galaxy Z Fold 8’s crease is much less visible than previous Samsung foldable phones. It’s still there, but more subtle.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Brightness HDR (nits)</strong></p></td><td  ><p><strong>Color (DCI-P3)</strong></p></td><td  ><p><strong>Accuracy (Delta-E)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold  Ultra</strong></p></td><td  ><p>2,687</p></td><td  ><p>116.6% (Natural)</p></td><td  ><p>0.2</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>1,806</p></td><td  ><p>90.6% (Natural)</p></td><td  ><p>0.22</p></td></tr></tbody></table></div><p>Thanks to a brighter screen, I also found using the Z Fold 8 outside in direct sunlight a lot easier, whether I was browsing the web or just taking or reviewing photos. On previous Samsung Folds, I mostly used the external screen for taking pics.</p><p>In our lab testing the Z Fold 8 Ultra hit 2,687 nits of brightness with HDR content. That’s considerably higher than the S26 Ultra’s 1,806 nits.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-s-pen"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: S Pen</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:4345px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="AQBTHresRLkR56MSUmEFMM" name="Galaxy S26 Ultra review-17" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/AQBTHresRLkR56MSUmEFMM-1920-80.jpg" mos="" align="middle" fullscreen="" width="4345" height="2444" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung ditched the S Pen on the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a> in order to make a thinner design and it’s still missing on the Fold 8 Ultra. Without a built-in digitizer for the screen, you simply can’t use an S Pen.</p><p>Meanwhile, the S26 Ultra has an S Pen built into the design. So you can use the stylus for taking notes, drawing and making fine edits on the go. </p><p>I spoke to Samsung executives about the missing S Pen on the Fold and they’re <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">“open” to bringing it back</a>.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-cameras"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3441px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="TnA5425ZLKYYYgLYV3DJDG" name="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra-3" alt="Samsung Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra rear cameras" src="https://cdn.mos.cms.futurecdn.net/TnA5425ZLKYYYgLYV3DJDG-1920-80.jpg" mos="" align="middle" fullscreen="" width="3441" height="1936" attribution="" endorsement="" 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 Galaxy Z Fold 8 Ultra has an <em>Ultra-ish</em> camera setup, starting with a 200MP main camera and 50MP ultraside, same as on the Galaxy S26 Ultra. But the new foldable falls down in the zoom department.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/aepV355MZkiSHL9bNuGfBo-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ttHc5QQrF7xwUSmwWn8QBo-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/BKQv5NjgvAqWQGAzbbDNsi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Tbcsv6heCjtKjWPzdCbZsi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Let’s start with the good news. In most conditions, the main and ultrawide cameras on the Fold 8 and S26 Ultra turned in nearly identical results, whether it was flower close-up ultra-wide shots of Bryant Park or portraits. Panoramas were similar, too.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=b187e00e-91d0-11f1-ba1b-0e6f42328d7d"></iframe><p>It’s when you try to get in close that the Fold 8, well, folds. While the S26 Ultra packs dual telephoto zoom lenses at 3x and 5x with a maximum of 100x digital zoom, the Fold 8 Ultra has only a single 10MP telephoto lens with 3x optical zoom and 30x digital zoom.</p><p>Check out this close-up of an ice cream truck. At 30x, you can make out all of the menu names underneath the pictures of the cones on the S26 Ultra. On the Fold 8 Ultra it’s just a bunch of blobs.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=3ddb19aa-91d0-11f1-ba1b-0e6f42328d7d"></iframe><p>Same thing with this shot of a medieval scholar sculpture on the side of a New York City building. At 10x, you can make out more details in his face, hair and garb. And at 30x the Fold 8’s Ultra’s shot looks like an impressionist painting by comparison.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/uKqxNfpVJr8eBRAQFcvTFi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - 10x<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/KuTqZjwfj6Cj3esegBBuii-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra - 10x<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GdFLdXVo8dWBJ9L5eHYGxh-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - 30x<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iuHdLkoLEJZT8xfG94DUFi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra - 30x<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>The S26 Ultra has a slight selfie advantage, too, with a 12MP front camera. The Fold 8 Ultra has dual 10MP shooters. But the results are pretty close in my eyes. The advantage the Fold has is that you can flip around the cover display and take super sharp selfies with the rear cameras.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Qtm4PmZ2UEHeBpzsJ86rgi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - Main camera<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/e8xVg6WGnZz9BPZSEvcrni-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy Z Fold 8 Ultra - Front camera<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/2jRFCRn8ANYoQ8b5WJRcoi-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra vs Galaxy S26 Ultra photo comparisons" /><figcaption>Galaxy S26 Ultra<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>I’d say the Fold 8 Ultra and S26 Ultra are fairly evenly matched in low-light settings. In this photo of a record player in near darkness, the S26 Ultra delivered a brighter and crisper shot. The colors look more realistic too, especially in the pink macrame.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=d70c81d2-91cf-11f1-ba1b-0e6f42328d7d"></iframe><p>However, while the S26 Ultra gave me a brighter shot of the bottles in this bar, especially the blue Casa Azul, the text looks sharper through the Fold 8 Ultra.</p><iframe allow="" height="395" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=b8df2c0a-91cf-11f1-ba1b-0e6f42328d7d"></iframe><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-performance"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3684px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="bFv6s9UZuRZHPMckD5pxaL" name="Galaxy S26 Ultra review-27" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/bFv6s9UZuRZHPMckD5pxaL-1920-80.jpg" mos="" align="middle" fullscreen="" width="3684" height="2072" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy S26 Ultra </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Packing the same Snapdragon 8 Elite Gen 5 chip for Galaxy, the Galaxy Z Fold 8 Ultra and S26 Ultra are both multitasking powerhouses, and they’re both great for gaming.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="yAdRaBVHZ6CPwD4QtQ3UxE" name="fold 8 ultra gaming" alt="Playing Wuthering Waves on Galaxy Z Fold 8 Ultra" src="https://cdn.mos.cms.futurecdn.net/yAdRaBVHZ6CPwD4QtQ3UxE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>In our lab tests, the S26 Ultra finished slightly ahead in Geekbench, 3DMark graphics and Geekbench AI, but I wouldn’t say it’s a big difference.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench 6 (Single/Multicore)</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>3,110/10,578</p></td><td  ><p>49.24/12,950</p></td><td  ><p>71715</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>3,733/11,457</p></td><td  ><p>49.37 / 12,984</p></td><td  ><p>83047 </p></td></tr></tbody></table></div><p>The S26 Ultra could be helped by the fact that it has vapor chamber cooling, while the Fold 8 Ultra does not.</p><p>I played Wuthering Waves on both the Fold 8 Ultra and S26 Ultra, and it was more immersive on the Fold because of its large display. But I found it a touch smoother on the S26 Ultra.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-battery-life-and-charging"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Battery life and charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2907px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="w8dEoJdD9j97ChKpUrPWwF" name="Galaxy S26 Ultra review" alt="Samsung Galaxy S26 Ultra with 60W charger" src="https://cdn.mos.cms.futurecdn.net/w8dEoJdD9j97ChKpUrPWwF-1920-80.jpg" mos="" align="middle" fullscreen="" width="2907" height="1635" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung has made the leap to silicon-carbon battery tech with the Fold 8 Ultra, going from 4,400 mAh on the Fold 7 to 5,000 mAh on its latest foldable. That’s the same capacity as the S26 Ultra albeit with lithium ion.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Hours:Mins</strong></p></td><td  ><p><strong>15-min charge</strong></p></td><td  ><p><strong>30-min charge</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>14:33</p></td><td  ><p>49%</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>16:40 </p></td><td  ><p>41%</p></td><td  ><p>77%</p></td></tr></tbody></table></div><p>On the Tom’s Guide battery test, which involves continuous web surfing over 5G, the Galaxy Z Fold 8 Ultra lasted an impressive 14 hours and 33 minutes. That’s a huge upgrade over the 11 hours turned in by the Fold 7.</p><p>The Galaxy S26 Ultra lasted an even longer 16 hours and 40 minutes, but keep in mind that it was powering a smaller 6.9-inch display compared to the 8-inch screen on the Fold 8.</p><p>The Fold 8 offers 45W wired charging and 20W wireless charging, compared to 60W wired and 25W wireless on the S26 Ultra. But the phones turned in similar results in our wired charging test.</p><p>The Fold 8 Ultra got to 76% in 30 minutes versus 77% for the S26 Ultra. Note that neither phone has built-in magnets for Qi 2 charging, so you’ll have to buy a case with that feature.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-software-and-special-features"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Software and special features</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4592px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dSkYa6nb5vfELq9CZP9HkM" name="Galaxy S26 Ultra review-21" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/dSkYa6nb5vfELq9CZP9HkM-1920-80.jpg" mos="" align="middle" fullscreen="" width="4592" height="2583" attribution="" endorsement="" class="inline"></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 Galaxy Z Fold 8 Ultra and Galaxy S26 Ultra offer a bunch of AI features that come in handy, including automated actions with Gemini (like helping to book dinner reservations or even vacations), Call Screening and Now Brief for summarizing your daily schedule. They also both let you transform your photos with a simple voice prompt.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3617px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="TFyBCFPuPGGHLrmtZ8NaYL" name="Galaxy S26 Ultra review-6" alt="Samsung Galaxy S26 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/TFyBCFPuPGGHLrmtZ8NaYL-1920-80.jpg" mos="" align="middle" fullscreen="" width="3617" height="2035" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, the Fold 8 Ultra offers a few unique tricks of its own. This includes Now Nudge in Split View, which can give you quick hints for opening a second app on its own screen to save time. And My FanCam can automatically follow a subject in your video, cropping the clip on the fly.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FTAPbqnyMxnn72TGFVq4Eg" name="Galaxy Z Fold 8 Ultra-29" alt="Galaxy Z Fold 8 Ultra Flex Mode" src="https://cdn.mos.cms.futurecdn.net/FTAPbqnyMxnn72TGFVq4Eg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy Z Fold 8 Ultra Flex Mode </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Plus, unlike the Galaxy S26 Ultra, the Fold 8 Ultra boasts a Flex Mode for using the foldable like a mini laptop. And when shooting photos and videos you can use the Cover Screen preview feature to let the subjects see themselves in real time.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-vs-galaxy-s26-ultra-verdict"><span>Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2046px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="nyEE9BKEyuBBNQFxKmYmcP" name="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra-4" alt="Samsung Galaxy Z Fold 8 Ultra vs. Galaxy S26 Ultra-4" src="https://cdn.mos.cms.futurecdn.net/nyEE9BKEyuBBNQFxKmYmcP-1920-80.jpg" mos="" align="middle" fullscreen="" width="2046" height="1151" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I’m not going to say that calling the Galaxy Z Fold 8 Ultra an Ultra phone is false advertising, but you do have to make a bunch of trade-offs versus the Galaxy S26 Ultra.</p><p>With the foldable you don’t get an S Pen or an IP68 rating for dust resistance, and the S26 Ultra offers both a more powerful telephoto zoom and Privacy Display feature. Plus, the S26 Ultra lasted longer on a charge.</p><p>However, the Galaxy Z Fold 8 Ultra is a very versatile foldable phone that grants you a much bigger display, the ability to run up three apps at once and handy AI tools like Now Nudge with Split View.</p><p>But at $2,099, the Fold 8 Ultra costs $800 more than the S26 Ultra. So you really, really want to own a foldable if you’re going that route. </p><p>Bottom line: If you want the ultimate multi-tasking powerhouse, get the Fold 8 Ultra. But if you want the biggest zoom, best-in-class privacy and an S Pen, snag the S26 Ultra for less.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra — which Android flagship will win? ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-everything-we-know-so-far">Google Pixel 11 Pro XL</a> is set to launch at the August 12 Made by Google event, alongside the rest of the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-everything-we-know-so-far">Pixel 11</a> series. If past releases are anything to go by, this should be the flagship Google phone for the year, with the largest display, best battery life and all the other things that make premium phones worth having. </p><p>But the question still remains, how will it compare to other flagships like the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a>? Pixel phones typically lag behind their rivals in the hardware department, and while they do make up some of the distance with robust AI and software features, it still feels like something is missing. A new phone is a new opportunity to one-up the competition, but will the Pixel 11 Pro XL actually catch up to the Galaxy S26 Ultra?</p><p>Here's our rundown of Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra, based on all the rumors and leaks we've heard so far.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-specs"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Google Pixel 11 Pro XL (rumored)</strong></p></td><td  ><p><strong>Samsung Galaxy S26 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $1,299</p></td><td  ><p>From $1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>6.8-inch OLED</p></td><td  ><p>6.9-inch AMOLD</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Tensor G6</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB / 16GB</p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB / 512GB / 1TB</p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Front Camera</strong></p></td><td  ><p>42MP</p></td><td  ><p>12MP</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Camera</strong></p></td><td  ><p>50MP main, 48MP ultrawide, 48MP telephoto (5x zoom)</p></td><td  ><p>200MP main, 50MP ultrawide, 50MP telelphoto (5x zoom), 10MP telelphoto (3MP)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>5,115 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired, 25W wireless</p></td><td  ><p>45W wired, 25W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Operating System</strong></p></td><td  ><p>Android 16</p></td><td  ><p>One UI 8.5</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.4 x 3.01 x 0.33 inches</p></td><td  ><p>6.44 x 3.07 x 0.31 inches</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-price-availability"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Price & availability</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:656px;"><p class="vanilla-image-block" style="padding-top:56.40%;"><img id="8897kp7dMTMmu9uULdRdmC" name="image (2)" alt="leaked google pixel 11 pro xl images" src="https://cdn.mos.cms.futurecdn.net/8897kp7dMTMmu9uULdRdmC-1920-80.jpg" mos="" align="middle" fullscreen="" width="656" height="370" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass)</span></figcaption></figure><p>The Samsung Galaxy S26 Ultra is available right now, with a starting price of $1,299 for a model with 256GB of storage and 12GB of RAM. However, given the phone is a few months old, we have started seeing some significant discounts from various retailers — including Samsung itself.</p><p>The Google Pixel 11 Pro XL is expected to cost $100 more than last year's model, meaning the phone may start at $1,299. The cheapest model will reportedly come with 256GB of storage once again, but it may feature a memory downgrade with just 12GB of RAM — compared to 16GB in the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Pixel 10 Pro XL</a>.</p><p>In other words, it looks like both phones will cost the same amount for similar core specs. </p><p>The Pixel 11 Pro XL release date isn't known right now, but new Google typically opens pre-orders for new Pixel devices at the end of the launch event, with the release day scheduled one to two weeks later. So expect to have your hands on a Pixel 11 Pro XL before the end of the month.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-design-display"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Design & display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nmC8mEhVxiXZQUnUDWbEKm" name="Samsung-Galaxy-S26-Ultra-home-screen" alt="Front view of Samsung Galaxy S26 Ultra held up against a brick wall" src="https://cdn.mos.cms.futurecdn.net/nmC8mEhVxiXZQUnUDWbEKm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy S26 Ultra is the larger of the two phones, rocking a 6.9-inch screen, measuring 6.44 x 3.07 x 0.31 in and weighing 7.55 oz. Meanwhile the Pixel 11 Pro XL is expected to come with a 6.8-inch display, measure 6.4 x 30.1 x 0.33 inches and weigh 7.9 ounces. That means, despite being slightly smaller, it is a heavier device — though part of that will come from the <a href="https://www.tomsguide.com/phones/what-is-qi2-wireless-charging">Qi2 magnets</a> in the back of the 11 Pro XL.</p><p>The 11 Pro XL's screen is tipped to be brighter, with<a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-11-specs-leak-reveals-what-upgrades-to-expect-and-some-concerning-downgrades"> leaks promising a 3,600 nit display</a>, compared to the 2,600 nit S26 Ultra. This should prove beneficial for the 11 Pro XL in bright situations, though it's unclear if it will have an anti-reflective coating the same way Samsung offers. Likewise, it's unlikely we'll see 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> features from Google anytime soon.</p><p>Both phones should offer rounded corners, though Google has the horizontal triple-lens camera bar while Samsung has stuck with the vertical quad-lens system for another generation. However Samsung's phone lacks the "<a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-just-leaked-via-amazon-heres-the-specs-colors-and-obligatory-price-hike">Pixel Glow</a>" feature that's rumored to be coming to all Pixel 11 phones, and is expected to serve as a notification light on the back of the device.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-performance"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:656px;"><p class="vanilla-image-block" style="padding-top:56.40%;"><img id="MMVKYt4EStWuesGovSJ8oC" name="image (3)" alt="leaked google pixel 11 pro xl images" src="https://cdn.mos.cms.futurecdn.net/MMVKYt4EStWuesGovSJ8oC-1920-80.jpg" mos="" align="middle" fullscreen="" width="656" height="370" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass)</span></figcaption></figure><p>Performance is not the area Google usually excels at, especially since it moved to Tensor chips. Considering this, and how high the performance benchmarks are for Galaxy S26 Ultra's <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-performance-face-off-snapdragon-8-elite-gen-5-vs-exynos-2600">Snapdragon 8 Elite Gen 5 for Galaxy</a>, we should not expect to see the Pixel 11 Pro XL topping any benchmark leagues following its release.</p><p>That's especially true when you remember some of the rumored changes coming to this year's <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-tensor-g5-and-g6-chips-forecasted-to-lag-behind-apple-and-qualcomm">Tensor G6 chip</a>. The G6 is rumored to drop to seven cores, instead of the usual eight, though it will be built on TSMC's 2nm process — which improves transistor density, and in the process boosts performance and power efficiency. To make matters worse, Google is utilizing a <a href="https://www.tomsguide.com/ai/google-to-remove-samsung-from-its-tensor-g6-modem-heres-why-that-matters">MediaTek M90 modem,</a> which is several years old at this point.</p><p>There's more to performance than benchmarks and the latest hardware, but considering Google's track record with weak performance, you'd have thought it would make more of an effort.</p><p>The 11 Pro XL is also expected to come with a new <a href="https://www.tomsguide.com/phones/google-pixel-phones/tensor-g6-chipset-could-give-the-pixel-11-the-biggest-security-upgrade-since-pixel-6-heres-how">Titan M3 security chip</a>, which will supposedly feature a new "Tensor Processing Unit" and offer forwards-compatible protection against whatever future cyberattacks bad actors might develop — though how that compares to the latest version of Samsung's Knox isn't clear.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-cameras"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2715px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="vbGrCLaZGfUvCojyg8YYUd" name="Galaxy S26 Ultra 24 hours-12" alt="Samsung Galaxy S26 Ultra" src="https://cdn.mos.cms.futurecdn.net/vbGrCLaZGfUvCojyg8YYUd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2715" height="1527" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On paper the Galaxy S26 Ultra has the advantage in the camera department. The phone is equipped with a 200MP main camera lens, partnered with a 50MP ultrawide lens, 50MP telephoto lens with 5x optical zoom and a 10MP secondary telephoto capable of 3x optical zoom — plus a 12MP selfie camera on the front.</p><p>In contrast, the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-11-specs-leak-reveals-what-upgrades-to-expect-and-some-concerning-downgrades">Pixel 11 Pro XL is expected to come with a 50MP main camera</a>, 48MP ultrawide and a 48MP telephoto lens with 5x optical zoom (and up to <a href="https://www.androidheadlines.com/2026/08/new-leaks-confirm-the-pixel-11-pros-120x-zoom-feature.html" target="_blank">120x AI assisted digital zoom</a>). There's no word on what sort of resolution to expect from the selfie camera, but you shouldn't expect anything less than the 42MP lens from the Pixel 10 Pro XL.</p><p>Obviously we won't know how much better or worse the Pixel 11 Pro XL's cameras are compared to S26 Ultra until we actually get our hands on the phone. Camera hardware only tells you so much, especially with how important software has become to the photography process. So we'll have to do some thorough hands-on testing </p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-software-ai"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Software & AI</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:1154px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="XT3UDi3a4UHzdbWs5SN5P3" name="Pixel 11 render" alt="Pixel 11 render" src="https://cdn.mos.cms.futurecdn.net/XT3UDi3a4UHzdbWs5SN5P3-1920-80.jpg" mos="" align="middle" fullscreen="" width="1154" height="649" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OnLeaks / Android Headlines)</span></figcaption></figure><p>Software is easily the area where Pixel phones excel, especially since the 11 Pro XL will be several months newer than the Galaxy S26 Ultra. The phone will have the usual array of software benefits, including first-in-line access to the latest Android updates, quarterly Pixel drops with new features, and the latest and best AI Google has to offer.</p><p>Samsung usually isn't that far behind, though. While One UI has had some hiccups in rolling out to everyone, Samsung tends to be pretty good at getting new updates to users fairly quickly. Just not as quickly as Google does with Pixel.</p><p>Likewise Samsung has invested a lot in AI, and there's been a lot of crossover between Pixel and Galaxy phones when it comes to the latest features. So we won't know for sure who has the best AI suite until Google actually reveals what the Pixel 11 series has to offer.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-battery-charging"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Battery & charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3755px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iGGyvv7a4hQPrn26YbFnid" name="Galaxy S26 Ultra 24 hours-11" alt="Samsung Galaxy S26 Ultra" src="https://cdn.mos.cms.futurecdn.net/iGGyvv7a4hQPrn26YbFnid-1920-80.jpg" mos="" align="middle" fullscreen="" width="3755" height="2112" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Battery life is another thing Pixels flag on compared to Samsung, but we won't know how much has changed until we actually test the 11 Pro XL's battery life for ourselves. However, the phone has a slightly smaller 5,115 mAh battery compared to the Pixel 10 Pro XL, which doesn't fill us with a lot of confidence.</p><p>The 10 Pro XL lasted 14 hours and 35 minutes in our custom battery test, compared to the 16 hours and 10 minutes recorded by the S26 Ultra. If the Pixel 10 Pro XL can't beat the S26 Ultra's 5,000 mAh battery life, then a smaller Pixel 11 Pro XL isn't likely to have much luck. </p><p>But you can't always predict these things ahead of time, and we will see what results the lab testing reveals following the 11 Pro XL's release.</p><p>The Pixel 11 Pro XL is also expected to offer 45W charging, which is slightly below that of the S26 Ultra's 60W speeds. However the two should be equal on the wireless charging front, with 25W Qi2.2 speeds, even if the Galaxy doesn't have the same built-in magnets as the Pixel. That said, the Galaxy S26 Ultra still offers reverse wireless charging, which Google scrapped last year.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-outlook"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Outlook</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:720px;"><p class="vanilla-image-block" style="padding-top:47.50%;"><img id="NP4Rd3TAo75Gm8MjECHatb" name="ezgif-4049ff33819a97ae" alt="Google Pixel 11 teaser gif with pixel glow effect" src="https://cdn.mos.cms.futurecdn.net/NP4Rd3TAo75Gm8MjECHatb-1920-80.gif" mos="" align="middle" fullscreen="" width="720" height="342" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Google)</span></figcaption></figure><p>We know a lot about the Pixel 11 Pro XL, even if the official reveal isn't scheduled until August 12. Sadly everything we've heard suggests that this is a basic run of the mill hardware upgrade from Google, which means it's going to struggle to compete with the Galaxy S26 Ultra — which is our pick for the best Android phone.</p><p>That said, we can't make an absolute decision until we have both phones in our possession, and compare their performance side by side. A lot of factors don't show up on the specs sheet, and the only way to figure out which phone is better is with hands-on testing. Performance, cameras and battery life are the main three.</p><p>So for now, it looks like Samsung may have the edge in a bunch of areas, even if Google hasn't quite given up yet. Still, for the time being, we're just going to have to be patient to see what Google actually has in store for us.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200">Galaxy Z Fold 8 vs. Fold 8 Ultra camera zoom test: Don't spend the extra $200 until you see this</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/this-is-the-pixel-11-pro-fold-and-this-is-when-pre-orders-officially-start">This is the Pixel 11 Pro Fold — and this is when pre-orders officially start</a></li><li><a href="https://www.tomsguide.com/phones/i-asked-siri-ai-and-gemini-a-series-of-increasingly-bizarre-questions-to-see-how-they-responded-heres-what-happened">I asked Siri AI and Gemini a series of increasingly bizarre questions to see how they responded —here's what happened</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-which-android-flagship-will-be-the-better-choice</link>
                                                                            <description>
                            <![CDATA[ Google Pixel 11 Pro XL is coming, but how to the leaks and rumors compare to Samsung's flagship Galaxy S26 Ultra? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Sqe9zms7f8LMXLwpxzBkmC</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/VfrarXRYBeYovgGwXRgoEX-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 06 Aug 2026 08:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Google Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/VfrarXRYBeYovgGwXRgoEX-1920-80.jpg">
                                                            <media:credit><![CDATA[Evan Blass / Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[google pixel 11 pro vs samsung galaxy s26 ultra]]></media:description>                                                            <media:text><![CDATA[google pixel 11 pro vs samsung galaxy s26 ultra]]></media:text>
                                <media:title type="plain"><![CDATA[google pixel 11 pro vs samsung galaxy s26 ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/VfrarXRYBeYovgGwXRgoEX-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-pro-everything-we-know-so-far">Google Pixel 11 Pro XL</a> is set to launch at the August 12 Made by Google event, alongside the rest of the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-everything-we-know-so-far">Pixel 11</a> series. If past releases are anything to go by, this should be the flagship Google phone for the year, with the largest display, best battery life and all the other things that make premium phones worth having. </p><p>But the question still remains, how will it compare to other flagships like the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Samsung Galaxy S26 Ultra</a>? Pixel phones typically lag behind their rivals in the hardware department, and while they do make up some of the distance with robust AI and software features, it still feels like something is missing. A new phone is a new opportunity to one-up the competition, but will the Pixel 11 Pro XL actually catch up to the Galaxy S26 Ultra?</p><p>Here's our rundown of Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra, based on all the rumors and leaks we've heard so far.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-specs"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Specs</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Google Pixel 11 Pro XL (rumored)</strong></p></td><td  ><p><strong>Samsung Galaxy S26 Ultra</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $1,299</p></td><td  ><p>From $1,299</p></td></tr><tr><td class="firstcol " ><p><strong>Display</strong></p></td><td  ><p>6.8-inch OLED</p></td><td  ><p>6.9-inch AMOLD</p></td></tr><tr><td class="firstcol " ><p><strong>Processor</strong></p></td><td  ><p>Tensor G6</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB / 16GB</p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB / 512GB / 1TB</p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Front Camera</strong></p></td><td  ><p>42MP</p></td><td  ><p>12MP</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Camera</strong></p></td><td  ><p>50MP main, 48MP ultrawide, 48MP telephoto (5x zoom)</p></td><td  ><p>200MP main, 50MP ultrawide, 50MP telelphoto (5x zoom), 10MP telelphoto (3MP)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>5,115 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired, 25W wireless</p></td><td  ><p>45W wired, 25W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Operating System</strong></p></td><td  ><p>Android 16</p></td><td  ><p>One UI 8.5</p></td></tr><tr><td class="firstcol " ><p><strong>Size</strong></p></td><td  ><p>6.4 x 3.01 x 0.33 inches</p></td><td  ><p>6.44 x 3.07 x 0.31 inches</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-price-availability"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Price & availability</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:656px;"><p class="vanilla-image-block" style="padding-top:56.40%;"><img id="8897kp7dMTMmu9uULdRdmC" name="image (2)" alt="leaked google pixel 11 pro xl images" src="https://cdn.mos.cms.futurecdn.net/8897kp7dMTMmu9uULdRdmC-1920-80.jpg" mos="" align="middle" fullscreen="" width="656" height="370" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass)</span></figcaption></figure><p>The Samsung Galaxy S26 Ultra is available right now, with a starting price of $1,299 for a model with 256GB of storage and 12GB of RAM. However, given the phone is a few months old, we have started seeing some significant discounts from various retailers — including Samsung itself.</p><p>The Google Pixel 11 Pro XL is expected to cost $100 more than last year's model, meaning the phone may start at $1,299. The cheapest model will reportedly come with 256GB of storage once again, but it may feature a memory downgrade with just 12GB of RAM — compared to 16GB in the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Pixel 10 Pro XL</a>.</p><p>In other words, it looks like both phones will cost the same amount for similar core specs. </p><p>The Pixel 11 Pro XL release date isn't known right now, but new Google typically opens pre-orders for new Pixel devices at the end of the launch event, with the release day scheduled one to two weeks later. So expect to have your hands on a Pixel 11 Pro XL before the end of the month.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-design-display"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Design & display</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nmC8mEhVxiXZQUnUDWbEKm" name="Samsung-Galaxy-S26-Ultra-home-screen" alt="Front view of Samsung Galaxy S26 Ultra held up against a brick wall" src="https://cdn.mos.cms.futurecdn.net/nmC8mEhVxiXZQUnUDWbEKm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Samsung Galaxy S26 Ultra is the larger of the two phones, rocking a 6.9-inch screen, measuring 6.44 x 3.07 x 0.31 in and weighing 7.55 oz. Meanwhile the Pixel 11 Pro XL is expected to come with a 6.8-inch display, measure 6.4 x 30.1 x 0.33 inches and weigh 7.9 ounces. That means, despite being slightly smaller, it is a heavier device — though part of that will come from the <a href="https://www.tomsguide.com/phones/what-is-qi2-wireless-charging">Qi2 magnets</a> in the back of the 11 Pro XL.</p><p>The 11 Pro XL's screen is tipped to be brighter, with<a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-11-specs-leak-reveals-what-upgrades-to-expect-and-some-concerning-downgrades"> leaks promising a 3,600 nit display</a>, compared to the 2,600 nit S26 Ultra. This should prove beneficial for the 11 Pro XL in bright situations, though it's unclear if it will have an anti-reflective coating the same way Samsung offers. Likewise, it's unlikely we'll see 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> features from Google anytime soon.</p><p>Both phones should offer rounded corners, though Google has the horizontal triple-lens camera bar while Samsung has stuck with the vertical quad-lens system for another generation. However Samsung's phone lacks the "<a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-11-just-leaked-via-amazon-heres-the-specs-colors-and-obligatory-price-hike">Pixel Glow</a>" feature that's rumored to be coming to all Pixel 11 phones, and is expected to serve as a notification light on the back of the device.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-performance"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Performance</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:656px;"><p class="vanilla-image-block" style="padding-top:56.40%;"><img id="MMVKYt4EStWuesGovSJ8oC" name="image (3)" alt="leaked google pixel 11 pro xl images" src="https://cdn.mos.cms.futurecdn.net/MMVKYt4EStWuesGovSJ8oC-1920-80.jpg" mos="" align="middle" fullscreen="" width="656" height="370" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Evan Blass)</span></figcaption></figure><p>Performance is not the area Google usually excels at, especially since it moved to Tensor chips. Considering this, and how high the performance benchmarks are for Galaxy S26 Ultra's <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-performance-face-off-snapdragon-8-elite-gen-5-vs-exynos-2600">Snapdragon 8 Elite Gen 5 for Galaxy</a>, we should not expect to see the Pixel 11 Pro XL topping any benchmark leagues following its release.</p><p>That's especially true when you remember some of the rumored changes coming to this year's <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-tensor-g5-and-g6-chips-forecasted-to-lag-behind-apple-and-qualcomm">Tensor G6 chip</a>. The G6 is rumored to drop to seven cores, instead of the usual eight, though it will be built on TSMC's 2nm process — which improves transistor density, and in the process boosts performance and power efficiency. To make matters worse, Google is utilizing a <a href="https://www.tomsguide.com/ai/google-to-remove-samsung-from-its-tensor-g6-modem-heres-why-that-matters">MediaTek M90 modem,</a> which is several years old at this point.</p><p>There's more to performance than benchmarks and the latest hardware, but considering Google's track record with weak performance, you'd have thought it would make more of an effort.</p><p>The 11 Pro XL is also expected to come with a new <a href="https://www.tomsguide.com/phones/google-pixel-phones/tensor-g6-chipset-could-give-the-pixel-11-the-biggest-security-upgrade-since-pixel-6-heres-how">Titan M3 security chip</a>, which will supposedly feature a new "Tensor Processing Unit" and offer forwards-compatible protection against whatever future cyberattacks bad actors might develop — though how that compares to the latest version of Samsung's Knox isn't clear.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-cameras"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Cameras</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2715px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="vbGrCLaZGfUvCojyg8YYUd" name="Galaxy S26 Ultra 24 hours-12" alt="Samsung Galaxy S26 Ultra" src="https://cdn.mos.cms.futurecdn.net/vbGrCLaZGfUvCojyg8YYUd-1920-80.jpg" mos="" align="middle" fullscreen="" width="2715" height="1527" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>On paper the Galaxy S26 Ultra has the advantage in the camera department. The phone is equipped with a 200MP main camera lens, partnered with a 50MP ultrawide lens, 50MP telephoto lens with 5x optical zoom and a 10MP secondary telephoto capable of 3x optical zoom — plus a 12MP selfie camera on the front.</p><p>In contrast, the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-11-specs-leak-reveals-what-upgrades-to-expect-and-some-concerning-downgrades">Pixel 11 Pro XL is expected to come with a 50MP main camera</a>, 48MP ultrawide and a 48MP telephoto lens with 5x optical zoom (and up to <a href="https://www.androidheadlines.com/2026/08/new-leaks-confirm-the-pixel-11-pros-120x-zoom-feature.html" target="_blank">120x AI assisted digital zoom</a>). There's no word on what sort of resolution to expect from the selfie camera, but you shouldn't expect anything less than the 42MP lens from the Pixel 10 Pro XL.</p><p>Obviously we won't know how much better or worse the Pixel 11 Pro XL's cameras are compared to S26 Ultra until we actually get our hands on the phone. Camera hardware only tells you so much, especially with how important software has become to the photography process. So we'll have to do some thorough hands-on testing </p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-software-ai"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Software & AI</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:1154px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="XT3UDi3a4UHzdbWs5SN5P3" name="Pixel 11 render" alt="Pixel 11 render" src="https://cdn.mos.cms.futurecdn.net/XT3UDi3a4UHzdbWs5SN5P3-1920-80.jpg" mos="" align="middle" fullscreen="" width="1154" height="649" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: OnLeaks / Android Headlines)</span></figcaption></figure><p>Software is easily the area where Pixel phones excel, especially since the 11 Pro XL will be several months newer than the Galaxy S26 Ultra. The phone will have the usual array of software benefits, including first-in-line access to the latest Android updates, quarterly Pixel drops with new features, and the latest and best AI Google has to offer.</p><p>Samsung usually isn't that far behind, though. While One UI has had some hiccups in rolling out to everyone, Samsung tends to be pretty good at getting new updates to users fairly quickly. Just not as quickly as Google does with Pixel.</p><p>Likewise Samsung has invested a lot in AI, and there's been a lot of crossover between Pixel and Galaxy phones when it comes to the latest features. So we won't know for sure who has the best AI suite until Google actually reveals what the Pixel 11 series has to offer.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-battery-charging"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Battery & charging</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3755px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="iGGyvv7a4hQPrn26YbFnid" name="Galaxy S26 Ultra 24 hours-11" alt="Samsung Galaxy S26 Ultra" src="https://cdn.mos.cms.futurecdn.net/iGGyvv7a4hQPrn26YbFnid-1920-80.jpg" mos="" align="middle" fullscreen="" width="3755" height="2112" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Battery life is another thing Pixels flag on compared to Samsung, but we won't know how much has changed until we actually test the 11 Pro XL's battery life for ourselves. However, the phone has a slightly smaller 5,115 mAh battery compared to the Pixel 10 Pro XL, which doesn't fill us with a lot of confidence.</p><p>The 10 Pro XL lasted 14 hours and 35 minutes in our custom battery test, compared to the 16 hours and 10 minutes recorded by the S26 Ultra. If the Pixel 10 Pro XL can't beat the S26 Ultra's 5,000 mAh battery life, then a smaller Pixel 11 Pro XL isn't likely to have much luck. </p><p>But you can't always predict these things ahead of time, and we will see what results the lab testing reveals following the 11 Pro XL's release.</p><p>The Pixel 11 Pro XL is also expected to offer 45W charging, which is slightly below that of the S26 Ultra's 60W speeds. However the two should be equal on the wireless charging front, with 25W Qi2.2 speeds, even if the Galaxy doesn't have the same built-in magnets as the Pixel. That said, the Galaxy S26 Ultra still offers reverse wireless charging, which Google scrapped last year.</p><h3 class="article-body__section" id="section-google-pixel-11-pro-xl-vs-samsung-galaxy-s26-ultra-outlook"><span>Google Pixel 11 Pro XL vs Samsung Galaxy S26 Ultra: Outlook</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:720px;"><p class="vanilla-image-block" style="padding-top:47.50%;"><img id="NP4Rd3TAo75Gm8MjECHatb" name="ezgif-4049ff33819a97ae" alt="Google Pixel 11 teaser gif with pixel glow effect" src="https://cdn.mos.cms.futurecdn.net/NP4Rd3TAo75Gm8MjECHatb-1920-80.gif" mos="" align="middle" fullscreen="" width="720" height="342" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Google)</span></figcaption></figure><p>We know a lot about the Pixel 11 Pro XL, even if the official reveal isn't scheduled until August 12. Sadly everything we've heard suggests that this is a basic run of the mill hardware upgrade from Google, which means it's going to struggle to compete with the Galaxy S26 Ultra — which is our pick for the best Android phone.</p><p>That said, we can't make an absolute decision until we have both phones in our possession, and compare their performance side by side. A lot of factors don't show up on the specs sheet, and the only way to figure out which phone is better is with hands-on testing. Performance, cameras and battery life are the main three.</p><p>So for now, it looks like Samsung may have the edge in a bunch of areas, even if Google hasn't quite given up yet. Still, for the time being, we're just going to have to be patient to see what Google actually has in store for us.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200">Galaxy Z Fold 8 vs. Fold 8 Ultra camera zoom test: Don't spend the extra $200 until you see this</a></li><li><a href="https://www.tomsguide.com/phones/google-pixel-phones/this-is-the-pixel-11-pro-fold-and-this-is-when-pre-orders-officially-start">This is the Pixel 11 Pro Fold — and this is when pre-orders officially start</a></li><li><a href="https://www.tomsguide.com/phones/i-asked-siri-ai-and-gemini-a-series-of-increasingly-bizarre-questions-to-see-how-they-responded-heres-what-happened">I asked Siri AI and Gemini a series of increasingly bizarre questions to see how they responded —here's what happened</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just tried the new Samsung DeX on the Galaxy Z Fold 8 — and it has one huge upgrade ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung’s new foldable phones are almost here, and if you’re planning to get any of them, you should know about their most underrated feature in my opinion: <a href="https://www.tomsguide.com/us/samsung-dex,review-4383.html">Samsung DeX</a>. This year’s lineup consists of three new foldables — the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Galaxy Z Flip 8</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Z Fold 8</a>, and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Z Fold 8 Ultra</a> — which all come with the latest version of Samsung’s desktop interface.</p><p>Just as before, you can easily access DeX by plugging them directly into a monitor, whether via USB-C, an HDMI port using a USB hub, or even wirelessly on a supported display or TV. I’ve been testing this new Samsung DeX for the past week, and it gains one specific feature that makes it more useful for productivity.</p><p>In fact, this new Samsung DeX is exactly like the one I tested on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-dex-quietly-gets-a-makeover-with-the-galaxy-s26-and-its-now-much-more-like-a-windows-pc">Galaxy S26 from earlier this year</a> — which inherited it from the now-discontinued <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-trifold-review">Galaxy Z TriFold</a>.</p><h2 class="article-body__section" id="section-samsung-dex-on-fold-8-and-flip-8-what-s-new"><span>Samsung DeX on Fold 8 and Flip 8: What's new</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="myCzeL2Fx2qx6pwtusH3kA" name="Samsung DeX on Galaxy Z Flip 8" alt="Samsung DeX on Galaxy Z Flip 8." src="https://cdn.mos.cms.futurecdn.net/myCzeL2Fx2qx6pwtusH3kA-1920-80.gif" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>The only new addition to this year’s Samsung DeX is the ability to create up to four workspaces. <strong>Each desktop can support up to five apps, which means I can run 20 different apps simultaneously.</strong></p><p>While I don’t need to actively use that many apps at once, having them organized makes a huge difference. For instance, I’ve set up one workspace strictly for work-related apps I frequently access — like Slack, Gmail, Chrome, Google Docs, and Messages. In another, I have my social networking apps, while a third is dedicated to editing apps I use consistently, such as CapCut, PhotoDirector, and PowerDirector.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/WjFVzPdrf9soNGKJisYh6o-1920-80.jpg" alt="Samsung DeX on Galaxy Z Flip 8." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/vkBfgjGzVoYbz3CtzTFLD-1920-80.jpg" alt="Samsung DeX on Galaxy Z Flip 8." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RCpxo3oYw85TxcVJiNbLYn-1920-80.jpg" alt="Samsung DeX on Galaxy Z Flip 8." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/72eYELvVWUVfzY6kWhdLHn-1920-80.jpg" alt="Samsung DeX on Galaxy Z Flip 8." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>By clicking the icon with the three vertical lines in the lower-left corner of the interface, I can easily jump to the workspace I need — which functions very similarly to how Windows 11 handles multiple desktops. With access to more workspaces, I can keep my apps organized and stay much more productive.</p><h2 class="article-body__section" id="section-samsung-dex-on-fold-8-and-flip-8-what-s-missing"><span>Samsung DeX on Fold 8 and Flip 8: What’s missing</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gZddKBggf4kMVgd2r74df9" name="Samsung DeX on Galaxy Z Flip 8" alt="Samsung DeX on Galaxy Z Flip 8." src="https://cdn.mos.cms.futurecdn.net/gZddKBggf4kMVgd2r74df9-1920-80.gif" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Apart from that, this version of Samsung DeX is no different from the past few iterations. For example, I like being able to run two apps side-by-side and automatically resize them by adjusting the slider between them. That way, I can make Chrome take up more of the desktop while leaving a smaller window for Slack.</p><p>However, there are still a few improvements that could elevate the experience. First and foremost, I’d love to see DeX copy <a href="https://www.tomsguide.com/computing/windows-operating-systems/5-windows-10-features-that-windows-11-does-way-better">Windows 11’s “Snap” feature</a>, which lets you arrange apps in preset layouts for better organization. While DeX still offers side-by-side multitasking, I want that extended to four apps at once — where each app occupies a quadrant of the display.</p><p>Secondly, I would love for Samsung to bring back support for multiple user profiles. Many of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a> offer this feature, but Samsung has left it out for several generations now. It’s a crucial addition because it would allow users to separate work and personal accounts cleanly. For example, I have bookmarks specifically tied to my work account that I can't access in DeX because Chrome is locked to my personal profile.</p><h2 class="article-body__section" id="section-samsung-dex-on-z-flip-8-z-fold-8-and-z-fold-8-ultra-bottom-line"><span>Samsung DeX on Z Flip 8, Z Fold 8, and Z Fold 8 Ultra: Bottom line</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:4768px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qy6NPJHf2JvQ5aboQNieDn" name="Samsung DeX on Galaxy Z Flip 8" alt="Samsung DeX on Galaxy Z Flip 8." src="https://cdn.mos.cms.futurecdn.net/qy6NPJHf2JvQ5aboQNieDn-1920-80.jpg" mos="" align="middle" fullscreen="" width="4768" height="2682" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>I can’t deny that I rely on <a href="https://www.tomsguide.com/phones/samsung-phones/i-ditched-my-laptop-for-2-weeks-for-the-galaxy-z-fold-6-heres-what-happened">Samsung DeX on these new foldables when I’m in a pinch and forget my laptop</a>. In fact, I can accomplish nearly 90% of my daily workload using DeX alone — though that missing 10% could easily be bridged if Samsung adds the features I mentioned.</p><p>DeX is also invaluable to me because I can pair it with my <a href="https://www.tomsguide.com/computing/vr-ar/smart-glasses/xreal-one-pro-ar-glasses-review">Xreal smart glasses</a>, a wireless mouse, and a Bluetooth keyboard. It makes for the ultimate portable desktop experience, projecting the interface directly in front of me with optional semi-transparency so I can stay aware of my surroundings.</p><p>And considering Samsung’s ongoing developments in <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-hands-on-with-the-new-samsung-smart-glasses-heres-why-id-pick-them-over-meta">wearable displays and smart glasses</a>, I’m genuinely excited to see where Samsung DeX goes next.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/ive-tested-the-galaxy-z-fold-8-and-it-proves-apple-really-needs-to-solve-this-one-thing">I’ve tested the Galaxy Z Fold 8 and it proves Apple really needs to solve this one thing</a></li><li><a href="https://www.tomsguide.com/ai/gemini-notebook-just-sold-me-on-foldables-heres-why-i-finally-get-the-hype">Gemini Notebook just sold me on foldables — here's why I finally get the hype</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Don't pay full price for your Galaxy Z Fold 8: this preorder deal knocks up to $1,200 off</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-just-tried-the-new-samsung-dex-on-the-galaxy-z-fold-8-and-it-has-one-huge-upgrade</link>
                                                                            <description>
                            <![CDATA[ After testing the new Samsung DeX across the Galaxy Z Fold 8, Fold 8 Ultra, and Flip 8, it's one small step forward in replacing my laptop. Here's why. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qjkCkm3wdLUarSLJAgnaS6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/AieHmWF2DYNhYEc6WiBT4n-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 06 Aug 2026 05:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/AieHmWF2DYNhYEc6WiBT4n-1920-80.jpg">
                                                            <media:credit><![CDATA[John Velasco / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung DeX on Galaxy Z Flip 8.]]></media:description>                                                            <media:text><![CDATA[Samsung DeX on Galaxy Z Flip 8.]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung DeX on Galaxy Z Flip 8.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/AieHmWF2DYNhYEc6WiBT4n-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung’s new foldable phones are almost here, and if you’re planning to get any of them, you should know about their most underrated feature in my opinion: <a href="https://www.tomsguide.com/us/samsung-dex,review-4383.html">Samsung DeX</a>. This year’s lineup consists of three new foldables — the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Galaxy Z Flip 8</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Z Fold 8</a>, and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Z Fold 8 Ultra</a> — which all come with the latest version of Samsung’s desktop interface.</p><p>Just as before, you can easily access DeX by plugging them directly into a monitor, whether via USB-C, an HDMI port using a USB hub, or even wirelessly on a supported display or TV. I’ve been testing this new Samsung DeX for the past week, and it gains one specific feature that makes it more useful for productivity.</p><p>In fact, this new Samsung DeX is exactly like the one I tested on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-dex-quietly-gets-a-makeover-with-the-galaxy-s26-and-its-now-much-more-like-a-windows-pc">Galaxy S26 from earlier this year</a> — which inherited it from the now-discontinued <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-trifold-review">Galaxy Z TriFold</a>.</p><h2 class="article-body__section" id="section-samsung-dex-on-fold-8-and-flip-8-what-s-new"><span>Samsung DeX on Fold 8 and Flip 8: What's new</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="myCzeL2Fx2qx6pwtusH3kA" name="Samsung DeX on Galaxy Z Flip 8" alt="Samsung DeX on Galaxy Z Flip 8." src="https://cdn.mos.cms.futurecdn.net/myCzeL2Fx2qx6pwtusH3kA-1920-80.gif" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>The only new addition to this year’s Samsung DeX is the ability to create up to four workspaces. <strong>Each desktop can support up to five apps, which means I can run 20 different apps simultaneously.</strong></p><p>While I don’t need to actively use that many apps at once, having them organized makes a huge difference. For instance, I’ve set up one workspace strictly for work-related apps I frequently access — like Slack, Gmail, Chrome, Google Docs, and Messages. In another, I have my social networking apps, while a third is dedicated to editing apps I use consistently, such as CapCut, PhotoDirector, and PowerDirector.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/WjFVzPdrf9soNGKJisYh6o-1920-80.jpg" alt="Samsung DeX on Galaxy Z Flip 8." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/vkBfgjGzVoYbz3CtzTFLD-1920-80.jpg" alt="Samsung DeX on Galaxy Z Flip 8." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RCpxo3oYw85TxcVJiNbLYn-1920-80.jpg" alt="Samsung DeX on Galaxy Z Flip 8." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/72eYELvVWUVfzY6kWhdLHn-1920-80.jpg" alt="Samsung DeX on Galaxy Z Flip 8." /><figcaption><small role="credit">John Velasco / Tom's Guide</small></figcaption></figure></figure><p>By clicking the icon with the three vertical lines in the lower-left corner of the interface, I can easily jump to the workspace I need — which functions very similarly to how Windows 11 handles multiple desktops. With access to more workspaces, I can keep my apps organized and stay much more productive.</p><h2 class="article-body__section" id="section-samsung-dex-on-fold-8-and-flip-8-what-s-missing"><span>Samsung DeX on Fold 8 and Flip 8: What’s missing</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:1280px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gZddKBggf4kMVgd2r74df9" name="Samsung DeX on Galaxy Z Flip 8" alt="Samsung DeX on Galaxy Z Flip 8." src="https://cdn.mos.cms.futurecdn.net/gZddKBggf4kMVgd2r74df9-1920-80.gif" mos="" align="middle" fullscreen="" width="1280" height="720" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Apart from that, this version of Samsung DeX is no different from the past few iterations. For example, I like being able to run two apps side-by-side and automatically resize them by adjusting the slider between them. That way, I can make Chrome take up more of the desktop while leaving a smaller window for Slack.</p><p>However, there are still a few improvements that could elevate the experience. First and foremost, I’d love to see DeX copy <a href="https://www.tomsguide.com/computing/windows-operating-systems/5-windows-10-features-that-windows-11-does-way-better">Windows 11’s “Snap” feature</a>, which lets you arrange apps in preset layouts for better organization. While DeX still offers side-by-side multitasking, I want that extended to four apps at once — where each app occupies a quadrant of the display.</p><p>Secondly, I would love for Samsung to bring back support for multiple user profiles. Many of the <a href="https://www.tomsguide.com/us/best-android-phones,review-6051.html">best Android phones</a> offer this feature, but Samsung has left it out for several generations now. It’s a crucial addition because it would allow users to separate work and personal accounts cleanly. For example, I have bookmarks specifically tied to my work account that I can't access in DeX because Chrome is locked to my personal profile.</p><h2 class="article-body__section" id="section-samsung-dex-on-z-flip-8-z-fold-8-and-z-fold-8-ultra-bottom-line"><span>Samsung DeX on Z Flip 8, Z Fold 8, and Z Fold 8 Ultra: Bottom line</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:4768px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="qy6NPJHf2JvQ5aboQNieDn" name="Samsung DeX on Galaxy Z Flip 8" alt="Samsung DeX on Galaxy Z Flip 8." src="https://cdn.mos.cms.futurecdn.net/qy6NPJHf2JvQ5aboQNieDn-1920-80.jpg" mos="" align="middle" fullscreen="" width="4768" height="2682" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>I can’t deny that I rely on <a href="https://www.tomsguide.com/phones/samsung-phones/i-ditched-my-laptop-for-2-weeks-for-the-galaxy-z-fold-6-heres-what-happened">Samsung DeX on these new foldables when I’m in a pinch and forget my laptop</a>. In fact, I can accomplish nearly 90% of my daily workload using DeX alone — though that missing 10% could easily be bridged if Samsung adds the features I mentioned.</p><p>DeX is also invaluable to me because I can pair it with my <a href="https://www.tomsguide.com/computing/vr-ar/smart-glasses/xreal-one-pro-ar-glasses-review">Xreal smart glasses</a>, a wireless mouse, and a Bluetooth keyboard. It makes for the ultimate portable desktop experience, projecting the interface directly in front of me with optional semi-transparency so I can stay aware of my surroundings.</p><p>And considering Samsung’s ongoing developments in <a href="https://www.tomsguide.com/computing/smart-glasses/i-just-went-hands-on-with-the-new-samsung-smart-glasses-heres-why-id-pick-them-over-meta">wearable displays and smart glasses</a>, I’m genuinely excited to see where Samsung DeX goes next.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/ive-tested-the-galaxy-z-fold-8-and-it-proves-apple-really-needs-to-solve-this-one-thing">I’ve tested the Galaxy Z Fold 8 and it proves Apple really needs to solve this one thing</a></li><li><a href="https://www.tomsguide.com/ai/gemini-notebook-just-sold-me-on-foldables-heres-why-i-finally-get-the-hype">Gemini Notebook just sold me on foldables — here's why I finally get the hype</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Don't pay full price for your Galaxy Z Fold 8: this preorder deal knocks up to $1,200 off</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z8 Series foldable pre-orders up 30% as half snag the wide Fold 8 — great news for iPhone Ultra ]]></title>
                                                                                                <dc:content><![CDATA[ <p>In the last couple of weeks,<a href="https://x.com/UniverseIce/status/2084505308836089926" target="_blank"> Samsung leakers</a> and <a href="https://www.sammobile.com/news/galaxy-z-flip-fold-8-sales-20-percent-higher-z-flip-fold-7-europe/" target="_blank">some news reports</a> have indicated that the Z Fold 8 series is proving super popular and already selling better than its predecessor. This could be great news for the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra,</a> which is supposed to launch next month.</p><p>Samsung decided to confirm those numbers itself with a new press release asserting that the Z8 series of foldables is breaking records for pre-orders, especially the new wider <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>. According to the Korean company, pre-orders increased more than 30% compared to last year's Galaxy Z Fold 7.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OajbyX"></div>                            </div>                            <script src="https://kwizly.com/embed/OajbyX.js" async></script><p>For the series, the wider Z Fold 8 makes up "nearly half of all pre-orders" with the Lavender color already sold out, though Graphite is apparently the most popular hue. Samsung claims 3x as many Flip users are switching to the bigger Fold this year as well.</p><p>Per the <a href="https://news.samsung.com/kr/%ec%9d%b4%eb%9f%b0-%ed%8f%b4%eb%8d%94%eb%b8%94%ec%9d%84-%ea%b8%b0%eb%8b%a4%eb%a0%a4-%ec%99%94%ec%96%b4%ec%9a%94%eb%82%a0%ec%94%a8%eb%a7%8c%ed%81%bc-%eb%9c%a8%ea%b1%b0" target="_blank">Korean version of the Samsung website</a>, the company received 1.44 million pre-orders between July 28 and August 3, a record for any Galaxy phone.</p><p>Additionally, the release reveals that the Z Fold 8, Z Fold 8, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Galaxy Z Flip 8</a>, the new <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-turned-the-galaxy-watch-ultra-2-into-a-fully-fledged-dive-computer-but-theres-a-catch">Galaxy Watch Ultra 2</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">Galaxy Watch 9</a> will all be available on store shelves starting Friday, August 7. </p><div class="product"><a data-dimension112="50b26a80-911a-11f1-8f3f-ab7dc7abc9a7" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="50b26a80-911a-11f1-8f3f-ab7dc7abc9a7" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch main display, 5.5-inch cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8 review</a>, we called it our favorite foldable design to date. <a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="50b26a80-911a-11f1-8f3f-ab7dc7abc9a7" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="50b26b2a-911a-11f1-b240-1d05d7b91779" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" 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="XUkFwYXYpdYjL4TYYivxEg" name="Samsung Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XUkFwYXYpdYjL4TYYivxEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="50b26b2a-911a-11f1-b240-1d05d7b91779" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>The Galaxy Z Fold 8 Ultra features an 8-inch main display, 6.5-inch cover display and triple camera setup that includes a 200MP main, 50MP ultra-wide, and 10MP 3x telephoto lens. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="50b26b2a-911a-11f1-b240-1d05d7b91779" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><h2 id="why-this-is-good-news-for-apple">Why this is good news for Apple</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1992px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="hxWF8JHH73hydhmk2vQ4mY" name="iPhone Fold" alt="A render of the potential upcoming iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/hxWF8JHH73hydhmk2vQ4mY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1992" height="1121" attribution="" endorsement="" class="inline"></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 more solid rumors surrounding the forthcoming iPhone Ultra is that Apple has opted for more of a <a href="https://www.tomsguide.com/phones/iphones/the-iphone-fold-could-blow-away-the-galaxy-z-fold-8-on-apples-very-first-try-heres-why">passport-style design</a> that is shorter and wider than traditional foldables like the Z Fold 8. A slew of dummy units and leaked renders have shown off the squatter form factor.</p><p>Samsung will likely never confirm this, but allegedly the company <a href="https://www.tomsguide.com/phones/samsung-phones/samsungs-galaxy-z-fold-8-wide-revealed-in-leaked-renders-and-the-iphone-fold-should-be-worried">redesigned the Z Fold 8 i</a>nto the new wider format specifically to rival Apple's purported design. </p><p>Apple's take on the passport-style foldable is supposed to feature an inner <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-leaker-just-spilled-the-beans-on-screen-sizes-and-its-worse-than-we-thought">display measuring 7.8 inches</a> in size or just slightly smaller than the iPad mini, but slightly bigger than the 7.6-inch display on the Z Fold 8. This size is supposed to give Apple's foldable an <a href="https://www.tomsguide.com/phones/iphones/the-foldable-iphone-is-coming-into-focus-heres-the-latest-details">aspect ratio close to 4:3,</a> just like the iPad.</p><p>Apple's device was probably going to prove popular since the tech giant claims around 32% of the <a href="https://gs.statcounter.com/vendor-market-share/mobile" target="_blank">global smartphone market share</a>.</p><p>But despite a starting price of $1,899, Samsung's wider foldable is proving popular. Early estimates tipped the iPhone Ultra to<a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-to-cost-over-usd2-000-heres-why-i-think-apples-making-a-mistake"> cost around $2,000</a>, though more recent ones have hedged <a href="https://www.tomsguide.com/phones/iphones/usd1-299-iphone-18-pro-max-analyst-now-predicts-usd200-price-hike-for-apples-next-flagship-phone">higher, around $2,400,</a> thanks to increased component costs.</p><p>If those prices are true, Samsung and Apple could be in for an interesting rivalry as Samsung's lower prices face Apple's popularity.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-leak-reveals-silicon-carbon-battery-leap-but-also-a-camera-downgrade">Samsung Galaxy S27 Ultra leak reveals silicon carbon battery leap — but also a camera downgrade</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-trekked-the-cascade-mountains-with-the-apple-watch-ultra-3-vs-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2-this-is-the-one-id-take-on-my-next-hike">I trekked the Cascade Mountains with the Apple Watch Ultra 3 vs Garmin Instinct 3 vs Samsung Galaxy Watch Ultra 2 — this is the one I'd take on my next hike</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/3-big-ways-the-iphone-ultra-could-beat-the-galaxy-z-fold-8">iPhone Ultra vs Galaxy Z Fold 8 — here's 3 big ways Apple could win</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z8-series-foldable-pre-orders-up-30-percent-as-half-snag-the-wide-fold-8-great-news-for-iphone-ultra</link>
                                                                            <description>
                            <![CDATA[ Samsung confirms reports that the Z Fold 8 foldable phones are very popular especially the new wider version. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">itRdkhzCo9a5xLEgzcM9JE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NPrLtCug9FGAyoEFnMEedN-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 05 Aug 2026 22:03:19 +0000</pubDate>                                                                                                                                <updated>Wed, 05 Aug 2026 22:09:23 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;br&gt;Send secure tips on Signal: scyo1.55.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/NPrLtCug9FGAyoEFnMEedN-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NPrLtCug9FGAyoEFnMEedN-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In the last couple of weeks,<a href="https://x.com/UniverseIce/status/2084505308836089926" target="_blank"> Samsung leakers</a> and <a href="https://www.sammobile.com/news/galaxy-z-flip-fold-8-sales-20-percent-higher-z-flip-fold-7-europe/" target="_blank">some news reports</a> have indicated that the Z Fold 8 series is proving super popular and already selling better than its predecessor. This could be great news for the <a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-rumors-everything-you-need-to-know-about-the-foldable-iphone">iPhone Ultra,</a> which is supposed to launch next month.</p><p>Samsung decided to confirm those numbers itself with a new press release asserting that the Z8 series of foldables is breaking records for pre-orders, especially the new wider <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>. According to the Korean company, pre-orders increased more than 30% compared to last year's Galaxy Z Fold 7.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OajbyX"></div>                            </div>                            <script src="https://kwizly.com/embed/OajbyX.js" async></script><p>For the series, the wider Z Fold 8 makes up "nearly half of all pre-orders" with the Lavender color already sold out, though Graphite is apparently the most popular hue. Samsung claims 3x as many Flip users are switching to the bigger Fold this year as well.</p><p>Per the <a href="https://news.samsung.com/kr/%ec%9d%b4%eb%9f%b0-%ed%8f%b4%eb%8d%94%eb%b8%94%ec%9d%84-%ea%b8%b0%eb%8b%a4%eb%a0%a4-%ec%99%94%ec%96%b4%ec%9a%94%eb%82%a0%ec%94%a8%eb%a7%8c%ed%81%bc-%eb%9c%a8%ea%b1%b0" target="_blank">Korean version of the Samsung website</a>, the company received 1.44 million pre-orders between July 28 and August 3, a record for any Galaxy phone.</p><p>Additionally, the release reveals that the Z Fold 8, Z Fold 8, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Galaxy Z Flip 8</a>, the new <a href="https://www.tomsguide.com/wellness/smartwatches/samsung-turned-the-galaxy-watch-ultra-2-into-a-fully-fledged-dive-computer-but-theres-a-catch">Galaxy Watch Ultra 2</a> and <a href="https://www.tomsguide.com/wellness/smartwatches/5-things-to-know-about-the-new-samsung-galaxy-watch-9">Galaxy Watch 9</a> will all be available on store shelves starting Friday, August 7. </p><div class="product"><a data-dimension112="50b26a80-911a-11f1-8f3f-ab7dc7abc9a7" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="50b26a80-911a-11f1-8f3f-ab7dc7abc9a7" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch main display, 5.5-inch cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8 review</a>, we called it our favorite foldable design to date. <a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="50b26a80-911a-11f1-8f3f-ab7dc7abc9a7" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="50b26b2a-911a-11f1-b240-1d05d7b91779" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" 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="XUkFwYXYpdYjL4TYYivxEg" name="Samsung Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XUkFwYXYpdYjL4TYYivxEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="50b26b2a-911a-11f1-b240-1d05d7b91779" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>The Galaxy Z Fold 8 Ultra features an 8-inch main display, 6.5-inch cover display and triple camera setup that includes a 200MP main, 50MP ultra-wide, and 10MP 3x telephoto lens. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="50b26b2a-911a-11f1-b240-1d05d7b91779" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><h2 id="why-this-is-good-news-for-apple">Why this is good news for Apple</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1992px;"><p class="vanilla-image-block" style="padding-top:56.28%;"><img id="hxWF8JHH73hydhmk2vQ4mY" name="iPhone Fold" alt="A render of the potential upcoming iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/hxWF8JHH73hydhmk2vQ4mY-1920-80.jpg" mos="" align="middle" fullscreen="" width="1992" height="1121" attribution="" endorsement="" class="inline"></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 more solid rumors surrounding the forthcoming iPhone Ultra is that Apple has opted for more of a <a href="https://www.tomsguide.com/phones/iphones/the-iphone-fold-could-blow-away-the-galaxy-z-fold-8-on-apples-very-first-try-heres-why">passport-style design</a> that is shorter and wider than traditional foldables like the Z Fold 8. A slew of dummy units and leaked renders have shown off the squatter form factor.</p><p>Samsung will likely never confirm this, but allegedly the company <a href="https://www.tomsguide.com/phones/samsung-phones/samsungs-galaxy-z-fold-8-wide-revealed-in-leaked-renders-and-the-iphone-fold-should-be-worried">redesigned the Z Fold 8 i</a>nto the new wider format specifically to rival Apple's purported design. </p><p>Apple's take on the passport-style foldable is supposed to feature an inner <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-leaker-just-spilled-the-beans-on-screen-sizes-and-its-worse-than-we-thought">display measuring 7.8 inches</a> in size or just slightly smaller than the iPad mini, but slightly bigger than the 7.6-inch display on the Z Fold 8. This size is supposed to give Apple's foldable an <a href="https://www.tomsguide.com/phones/iphones/the-foldable-iphone-is-coming-into-focus-heres-the-latest-details">aspect ratio close to 4:3,</a> just like the iPad.</p><p>Apple's device was probably going to prove popular since the tech giant claims around 32% of the <a href="https://gs.statcounter.com/vendor-market-share/mobile" target="_blank">global smartphone market share</a>.</p><p>But despite a starting price of $1,899, Samsung's wider foldable is proving popular. Early estimates tipped the iPhone Ultra to<a href="https://www.tomsguide.com/phones/iphones/iphone-fold-tipped-to-cost-over-usd2-000-heres-why-i-think-apples-making-a-mistake"> cost around $2,000</a>, though more recent ones have hedged <a href="https://www.tomsguide.com/phones/iphones/usd1-299-iphone-18-pro-max-analyst-now-predicts-usd200-price-hike-for-apples-next-flagship-phone">higher, around $2,400,</a> thanks to increased component costs.</p><p>If those prices are true, Samsung and Apple could be in for an interesting rivalry as Samsung's lower prices face Apple's popularity.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-leak-reveals-silicon-carbon-battery-leap-but-also-a-camera-downgrade">Samsung Galaxy S27 Ultra leak reveals silicon carbon battery leap — but also a camera downgrade</a></li><li><a href="https://www.tomsguide.com/wellness/fitness-trackers/i-trekked-the-cascade-mountains-with-the-apple-watch-ultra-3-vs-garmin-instinct-3-vs-samsung-galaxy-watch-ultra-2-this-is-the-one-id-take-on-my-next-hike">I trekked the Cascade Mountains with the Apple Watch Ultra 3 vs Garmin Instinct 3 vs Samsung Galaxy Watch Ultra 2 — this is the one I'd take on my next hike</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/3-big-ways-the-iphone-ultra-could-beat-the-galaxy-z-fold-8">iPhone Ultra vs Galaxy Z Fold 8 — here's 3 big ways Apple could win</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tested the Galaxy Z Fold 8 vs. Fold 8 Ultra to see if the lack of a telephoto zoom is a dealbreaker ]]></title>
                                                                                                <dc:content><![CDATA[ <p>One of the biggest complaints people have about the $1,899 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> (myself included) is that it doesn't have a dedicated telephoto zoom lens. You're stuck with just a wide and ultrawide camera. There's just a digital zoom that goes up to 10x.</p><p>Meanwhile, the $2,099 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a> packs a 3x telephoto lens with a max digital zoom of 30x. So does having a dedicated optical zoom camera make that big a difference? To find out, I took both of these <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">foldable phones</a> out to shoot a series of photos at various magnifications. And while there's very little difference at 4x, you really start to notice the difference at 10x (in some instances). Here's the results.</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/oFT-YOrakEg" allowfullscreen></iframe></div></div><h2 id="fold-8-vs-fold-8-ultra-ice-cream-truck-4x">Fold 8 vs Fold 8 Ultra: Ice cream truck (4x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=908e80d8-8f78-11f1-ba1b-0e6f42328d7d"></iframe><p>At first glance there doesn't seem to be much of a difference in this shot of an ice cream truck. But upon closer inspection, the Fold 8 Ultra's photo has sharper text, especially around the words "Cups" and "Shakes." Overall, the image from the Fold 8 Ultra looks clearer versus the regular Fold 8, whose shot generally looks hazier.</p><h2 id="fold-8-vs-fold-8-ultra-ice-cream-truck-10x">Fold 8 vs Fold 8 Ultra: Ice Cream Truck (10x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=b927fb6e-8f78-11f1-ba1b-0e6f42328d7d"></iframe><p>Ironically, as we zoom in even further at 10x, the Fold 8 Ultra doesn't offer a clearly superior shot. The digital zooms on both phones struggle to make out the text beneath the ice cream options. For that, you'd either need better AI processing or a longer telephoto lens.</p><div class="product"><a data-dimension112="7abfa68a-900c-11f1-b69c-410646b74ad0" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="7abfa68a-900c-11f1-b69c-410646b74ad0" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch main display, 5.5-inch cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8 review</a>, we called it our favorite foldable design to date. <a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="7abfa68a-900c-11f1-b69c-410646b74ad0" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="7abfa702-900c-11f1-9ab6-ffe0ecddbd0f" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" 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="XUkFwYXYpdYjL4TYYivxEg" name="Samsung Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XUkFwYXYpdYjL4TYYivxEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="7abfa702-900c-11f1-9ab6-ffe0ecddbd0f" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>The Galaxy Z Fold 8 Ultra features an 8-inch main display, 6.5-inch cover display and triple camera setup that includes a 200MP main, 50MP ultra-wide, and 10MP 3x telephoto lens. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="7abfa702-900c-11f1-9ab6-ffe0ecddbd0f" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><h2 id="fold-8-vs-fold-8-ultra-times-square-3x">Fold 8 vs Fold 8 Ultra: Times Square (3x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=d5cb95bf-8f78-11f1-ba1b-0e6f42328d7d"></iframe><p>For this shot I wanted to compare the true 3x optical zoom on the Fold 8 Ultra versus the 3x digital zoom on the Fold 8. And I have to say that the Fold 8 more than holds its own. Even upon close inspection I didn't notice much crisper detail from the Fold 8 Ultra. In fact, I prefer the slightly brighter exposure from the Fold 8, especially in the foreground.</p><h2 id="fold-8-vs-fold-8-ultra-statue-4x">Fold 8 vs Fold 8 Ultra: Statue (4x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=ee116f9a-8f78-11f1-ba1b-0e6f42328d7d"></iframe><p>I give the edge to the Galaxy Z Fold 8 in this photo of the José Bonifácio de Andrada e Silva statue in Bryant Park. The statue looks a bit sharper, and the string lights in the background are easier to make out. The Fold 8 Ultra's shot is fine but just not as crisp.</p><h2 id="fold-8-vs-fold-8-ultra-statue-10x">Fold 8 vs Fold 8 Ultra: Statue (10x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=058a989a-8f79-11f1-ba1b-0e6f42328d7d"></iframe><p>It's a different story at 10x zoom, as the Fold 8 Ultra pulls ahead. The shirt, tie and jacket on the statue all have more detail through the Ultra. The Fold 8's image is blurrier and loses some of the detail in the shadows.</p><h2 id="fold-8-vs-fold-8-ultra-street-sign-4x">Fold 8 vs Fold 8 Ultra: Street Sign (4x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=35e65f7e-8f79-11f1-ba1b-0e6f42328d7d"></iframe><p>I'm a bit torn when it comes to this photo of the Avenue of the Americas sign shot at 4x zoom. The text definitely pops more through the Fold 8 Ultra, both on the sign itself and on the Movie Nights sign to the right. However, the street sign post looks slightly better through the Fold 8.</p><h2 id="fold-8-vs-fold-8-ultra-street-sign-10x">Fold 8 vs Fold 8 Ultra: Street Sign (10x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=1da8ad40-8f79-11f1-ba1b-0e6f42328d7d"></iframe><p>Once we start zooming in further you can immediately tell that the 10x zoom on the Fold 8 Ultra produces sharper-looking text in the sign. All of the letters look crisper, though certainly not perfect. The Fold 8 struggles with a blurrier pic. The bronz pole for the lamp post has a lot more detail, too, especially in the ornamental leaves.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYdZvO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYdZvO.js" async></script><h2 id="fold-8-vs-fold-8-ultra-street-sign-10x-vs-30x">Fold 8 vs Fold 8 Ultra: Street Sign (10x vs 30x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=4e9dd6a0-8f79-11f1-ba1b-0e6f42328d7d"></iframe><p>Lastly, this shot shows how you can get really close on the street sign with the Fold 8 Ultra, which would require additional cropping on the Fold 8. And the Fold 8 Ultra comes out on top with more detail in the lettering. </p><h2 id="bottom-line-3">Bottom line</h2><p>My overall takeaway is that the Galaxy Z Fold 8 Ultra's telephoto zoom and longer digital zoom are indeed better than what you get from the Fold 8. Having a dedicated telephoto lens certainly helps, but the difference was not as dramatic as I was expecting. And to me this difference alone is certainly not worth paying an extra $200 for. </p><p>The Fold 8 Ultra has other advantages over the Fold 8, including a slightly larger display (8 inches vs 7.6 inches) and even longer battery life. But some may simply prefer the wider, shorter and lighter form factor of the Fold 8.</p><p>So, yes, the telephoto zoom matters. But I don't think it's a dealbreaker. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/ive-tested-the-galaxy-z-fold-8-and-it-proves-apple-really-needs-to-solve-this-one-thing">I’ve tested the Galaxy Z Fold 8 and it proves Apple really needs to solve this one thing</a></li><li><a href="https://www.tomsguide.com/ai/gemini-notebook-just-sold-me-on-foldables-heres-why-i-finally-get-the-hype">Gemini Notebook just sold me on foldables — here's why I finally get the hype</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Don't pay full price for your Galaxy Z Fold 8: this preorder deal knocks up to $1,200 off</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Z Fold 8 Ultra's dedicated telephoto lens is one reason you'd pick it up over Galaxy the  Z Fold 8, so I put their camera capabilities to the test. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">vPSVz9swi8e5gss2wZCW5o</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NPrLtCug9FGAyoEFnMEedN-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 05 Aug 2026 04:00:00 +0000</pubDate>                                                                                                                                <updated>Wed, 05 Aug 2026 16:39:36 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/NPrLtCug9FGAyoEFnMEedN-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NPrLtCug9FGAyoEFnMEedN-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>One of the biggest complaints people have about the $1,899 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> (myself included) is that it doesn't have a dedicated telephoto zoom lens. You're stuck with just a wide and ultrawide camera. There's just a digital zoom that goes up to 10x.</p><p>Meanwhile, the $2,099 <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a> packs a 3x telephoto lens with a max digital zoom of 30x. So does having a dedicated optical zoom camera make that big a difference? To find out, I took both of these <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">foldable phones</a> out to shoot a series of photos at various magnifications. And while there's very little difference at 4x, you really start to notice the difference at 10x (in some instances). Here's the results.</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/oFT-YOrakEg" allowfullscreen></iframe></div></div><h2 id="fold-8-vs-fold-8-ultra-ice-cream-truck-4x">Fold 8 vs Fold 8 Ultra: Ice cream truck (4x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=908e80d8-8f78-11f1-ba1b-0e6f42328d7d"></iframe><p>At first glance there doesn't seem to be much of a difference in this shot of an ice cream truck. But upon closer inspection, the Fold 8 Ultra's photo has sharper text, especially around the words "Cups" and "Shakes." Overall, the image from the Fold 8 Ultra looks clearer versus the regular Fold 8, whose shot generally looks hazier.</p><h2 id="fold-8-vs-fold-8-ultra-ice-cream-truck-10x">Fold 8 vs Fold 8 Ultra: Ice Cream Truck (10x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=b927fb6e-8f78-11f1-ba1b-0e6f42328d7d"></iframe><p>Ironically, as we zoom in even further at 10x, the Fold 8 Ultra doesn't offer a clearly superior shot. The digital zooms on both phones struggle to make out the text beneath the ice cream options. For that, you'd either need better AI processing or a longer telephoto lens.</p><div class="product"><a data-dimension112="7abfa68a-900c-11f1-b69c-410646b74ad0" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="7abfa68a-900c-11f1-b69c-410646b74ad0" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch main display, 5.5-inch cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8 review</a>, we called it our favorite foldable design to date. <a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="7abfa68a-900c-11f1-b69c-410646b74ad0" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="7abfa702-900c-11f1-9ab6-ffe0ecddbd0f" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" 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="XUkFwYXYpdYjL4TYYivxEg" name="Samsung Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XUkFwYXYpdYjL4TYYivxEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="7abfa702-900c-11f1-9ab6-ffe0ecddbd0f" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>The Galaxy Z Fold 8 Ultra features an 8-inch main display, 6.5-inch cover display and triple camera setup that includes a 200MP main, 50MP ultra-wide, and 10MP 3x telephoto lens. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="7abfa702-900c-11f1-9ab6-ffe0ecddbd0f" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><h2 id="fold-8-vs-fold-8-ultra-times-square-3x">Fold 8 vs Fold 8 Ultra: Times Square (3x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=d5cb95bf-8f78-11f1-ba1b-0e6f42328d7d"></iframe><p>For this shot I wanted to compare the true 3x optical zoom on the Fold 8 Ultra versus the 3x digital zoom on the Fold 8. And I have to say that the Fold 8 more than holds its own. Even upon close inspection I didn't notice much crisper detail from the Fold 8 Ultra. In fact, I prefer the slightly brighter exposure from the Fold 8, especially in the foreground.</p><h2 id="fold-8-vs-fold-8-ultra-statue-4x">Fold 8 vs Fold 8 Ultra: Statue (4x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=ee116f9a-8f78-11f1-ba1b-0e6f42328d7d"></iframe><p>I give the edge to the Galaxy Z Fold 8 in this photo of the José Bonifácio de Andrada e Silva statue in Bryant Park. The statue looks a bit sharper, and the string lights in the background are easier to make out. The Fold 8 Ultra's shot is fine but just not as crisp.</p><h2 id="fold-8-vs-fold-8-ultra-statue-10x">Fold 8 vs Fold 8 Ultra: Statue (10x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=058a989a-8f79-11f1-ba1b-0e6f42328d7d"></iframe><p>It's a different story at 10x zoom, as the Fold 8 Ultra pulls ahead. The shirt, tie and jacket on the statue all have more detail through the Ultra. The Fold 8's image is blurrier and loses some of the detail in the shadows.</p><h2 id="fold-8-vs-fold-8-ultra-street-sign-4x">Fold 8 vs Fold 8 Ultra: Street Sign (4x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=35e65f7e-8f79-11f1-ba1b-0e6f42328d7d"></iframe><p>I'm a bit torn when it comes to this photo of the Avenue of the Americas sign shot at 4x zoom. The text definitely pops more through the Fold 8 Ultra, both on the sign itself and on the Movie Nights sign to the right. However, the street sign post looks slightly better through the Fold 8.</p><h2 id="fold-8-vs-fold-8-ultra-street-sign-10x">Fold 8 vs Fold 8 Ultra: Street Sign (10x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=1da8ad40-8f79-11f1-ba1b-0e6f42328d7d"></iframe><p>Once we start zooming in further you can immediately tell that the 10x zoom on the Fold 8 Ultra produces sharper-looking text in the sign. All of the letters look crisper, though certainly not perfect. The Fold 8 struggles with a blurrier pic. The bronz pole for the lamp post has a lot more detail, too, especially in the ornamental leaves.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYdZvO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYdZvO.js" async></script><h2 id="fold-8-vs-fold-8-ultra-street-sign-10x-vs-30x">Fold 8 vs Fold 8 Ultra: Street Sign (10x vs 30x)</h2><iframe allow="" height="463" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=4e9dd6a0-8f79-11f1-ba1b-0e6f42328d7d"></iframe><p>Lastly, this shot shows how you can get really close on the street sign with the Fold 8 Ultra, which would require additional cropping on the Fold 8. And the Fold 8 Ultra comes out on top with more detail in the lettering. </p><h2 id="bottom-line-3">Bottom line</h2><p>My overall takeaway is that the Galaxy Z Fold 8 Ultra's telephoto zoom and longer digital zoom are indeed better than what you get from the Fold 8. Having a dedicated telephoto lens certainly helps, but the difference was not as dramatic as I was expecting. And to me this difference alone is certainly not worth paying an extra $200 for. </p><p>The Fold 8 Ultra has other advantages over the Fold 8, including a slightly larger display (8 inches vs 7.6 inches) and even longer battery life. But some may simply prefer the wider, shorter and lighter form factor of the Fold 8.</p><p>So, yes, the telephoto zoom matters. But I don't think it's a dealbreaker. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom’s Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/ive-tested-the-galaxy-z-fold-8-and-it-proves-apple-really-needs-to-solve-this-one-thing">I’ve tested the Galaxy Z Fold 8 and it proves Apple really needs to solve this one thing</a></li><li><a href="https://www.tomsguide.com/ai/gemini-notebook-just-sold-me-on-foldables-heres-why-i-finally-get-the-hype">Gemini Notebook just sold me on foldables — here's why I finally get the hype</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Don't pay full price for your Galaxy Z Fold 8: this preorder deal knocks up to $1,200 off</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I used a thermal camera to see how hot the Galaxy Z Fold 8 Ultra gets compared to the Galaxy S26 Ultra — here's what happened ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung has packed a bunch of upgrades into the new <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>, but the one noticeable absence is the lack of any sort of active cooling system. The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a> has a built-in vapor chamber to prevent heat build-up, and similar features have existed in non-folding flagships for over a decade.</p><p>The question isn't why hasn't Samsung added a vapor chamber to its foldables yet, it's whether that actually matters. The Galaxy Z Fold 8 Ultra has the same super-powered <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-performance-face-off-snapdragon-8-elite-gen-5-vs-exynos-2600">Snapdragon 8 Elite Gen 5 for Galaxy chip </a>as the S26 Ultra, and I was curious how much heat would actually build up in both phones — and more importantly, where it ends up.</p><p>So I grabbed my trusty thermal camera, the <a href="https://www.tomsguide.com/opinion/i-used-this-thermal-camera-to-identify-heat-loss-in-my-home-heres-what-i-found">Flir One Pro</a>, and set up the Galaxy Z Fold 8 Ultra alongside the Galaxy S26 Ultra, <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a> and the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> side by side. Then, by running <a href="https://www.3dmark.com/" target="_blank" rel="nofollow">3DMark's</a> Solar Bay Extreme Stress Test, I recorded just how much heat all four phones produced.</p><h2 id="is-it-getting-hot-in-here">Is it getting hot in 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:693px;"><p class="vanilla-image-block" style="padding-top:64.07%;"><img id="znB7Xvbzpp2dt6HgMwsjSj" name="ezgif-65d79b61dde731aa" alt="z fold 8 ultra thermal camera" src="https://cdn.mos.cms.futurecdn.net/znB7Xvbzpp2dt6HgMwsjSj-1920-80.gif" mos="" align="middle" fullscreen="" width="693" height="444" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Left to right: S26 Ultra, iPhone 17 Pro Max, Z Fold 8 Ultra, Z Fold 7 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you look at the video of all four phones, you can see that the Galaxy S26 Ultra starts heating up the fastest, hitting around 30C/86F in around a minute. The iPhone 17 Pro Max isn't that far behind, though the Z Fold 8 Ultra and Z Fold 7 both seem to be heating up a lot more slowly in their folded state.</p><p>The S26 Ultra seems to concentrate most of its heat in the top left corner, on the opposite side of the phone to the vertical camera bar. Meanwhile, the iPhone 17 Pro Max has a large section of heat across its top half, where the raised plateau camera bar is — which makes sense considering Apple designed the camera bar to help dissipate heat.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ZRLvLLAGituNoaESiU4oo9-1920-80.png" alt="z fold 8 ultra thermal camera test" /><figcaption>1 minute into testing<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bzj92un33KpMxAF44bHwo9-1920-80.png" alt="z fold 8 ultra thermal camera test" /><figcaption>4 minutes into testing<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/oX5iuHNRbkQxxyWEGvANp9-1920-80.png" alt="z fold 8 ultra thermal camera test" /><figcaption>9 minutes into testing<small role="credit">Future</small></figcaption></figure></figure><p>As the videos approach the 4-minute mark, the S26 Ultra starts to approach 40C/104F, while the two foldables only just hit 30C/86F. The iPhone isn't that far behind Samsung, and in the case of all four phones the heat seems to be mainly concentrated in the top half of each device. </p><p>By the time the 10-minute run is almost complete, parts of the S26 Ultra and iPhone have exceeded 40C/104F, while the foldables both seem to be hovering between 35C/95F and 37C/99F. At this stage the heat seems to have covered the entirety of the four phones, though only the iPhone and S26 Ultra have such high concentrations.</p><p>When I picked up the phones after closing 3DMark, I found that the S26 Ultra definitely felt the hottest, especially around the camera bar. Not quite enough to instantly burn yourself, but hot enough that you don't want prolonged exposure to it. The iPhone was similar, though didn't feel quite as hot, while the two foldables didn't feel that much different from normal.</p><h2 id="unfolding-the-heat">Unfolding the heat</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:601px;"><p class="vanilla-image-block" style="padding-top:64.89%;"><img id="4NBA7rCAbyzBwqtNsmwwVW" name="ezgif-6d4db9046320a37d" alt="z fold 8 ultra vs z fold 7 thermal camera test" src="https://cdn.mos.cms.futurecdn.net/4NBA7rCAbyzBwqtNsmwwVW-1920-80.gif" mos="" align="middle" fullscreen="" width="601" height="390" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Left: Galaxy Z Fold 8 Ultra. Right: Galaxy Z Fold 7 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Of course these readings were taken from the front of the phone, while the two foldables were all closed up. How much of a difference would unfolding them make? As it turns out, quite a lot.</p><p>As soon as the benchmarking test started, heat bloomed out of both phones in the top right — right where the camera bar is. Unsurprisingly given its more powerful hardware, the temperature climbed much higher on the Z Fold 8 Ultra, though the Z Fold 7 wasn't that far behind.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/g9wgFLhXViFwMhiYSLPDxG-1920-80.png" alt="z fold 8 ultra vs z fold 7 thermal test screenshots" /><figcaption>1 minute into testing<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/73eGhkiwfqAfgimrDBqfvG-1920-80.png" alt="z fold 8 ultra vs z fold 7 thermal test screenshots" /><figcaption>5 minutes into testing<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ookdm6idgGQ2qpSU3Z9etG-1920-80.png" alt="z fold 8 ultra vs z fold 7 thermal test screenshots" /><figcaption>10 minutes into testing<small role="credit">Future</small></figcaption></figure></figure><p>Within 20 seconds the temperature had jumped past 30C/89F, and after a minute the Z Fold 8 Ultra had already climbed past 40C/104F. 20 seconds later the Z Fold 7 joined it, and in both cases the heat was concentrated in the top right corner before slowly spreading out over both halves of the phones.</p><p>The temperature plateaued pretty quickly, landing a few degrees higher than 40C and hovering around that level. The majority of the heat remained concentrated on the right side of the phone too, with minimal transference  over to the left half. </p><p>This explains why the heat build-up seemed so slow in the previous test. The majority of the heat will have also been concentrated at the back of the device where the thermal camera couldn't pick it up as easily.</p><h2 id="verdict-2">Verdict</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="noN4XNdYP8ruPAPbWSqySm" name="PXL_20260723_153411133" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/noN4XNdYP8ruPAPbWSqySm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 Ultra can get pretty hot, but so does the Galaxy S26 Ultra and both phones seem to heat up to similar temperatures. Or, at least they did during identical Solar Bay Extreme Stress Tests — different processes will obviously have different effects.</p><p>The way the heat spread out was completely different, though. The Galaxy S26 Ultra recorded the highest temperatures in the top left side of the phone, on the opposite side of the phone to the cameras. Teardowns have revealed that this is where the vapor chamber cooling pushes the excess heat, so it's natural that this would see the most extreme temperatures. The same goes for the iPhone 17 Pro Max and its own raised camera bar.</p><p>The unfolded stress test showed that the Z Fold 8 Ultra (and Z Fold 7) don't have that advantage. While the heat appears in that top corner by the cameras, it quickly spreads across the entire right side of the phone. Apparently, the heat struggled to bypass the hinge, which is an interesting observation.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OqRVBX"></div>                            </div>                            <script src="https://kwizly.com/embed/OqRVBX.js" async></script><p>In the case of the Z Fold 8 Ultra the heat isn't being actively routed away from core internal components — like the battery or chipset. That means it has no choice but to spread out until it reaches the edge of the phone and radiates away. You can actually see that happening in the thermal video as the heat spreads out from the very top of the phone.</p><p>While concentrating the heat in one area seems like a bad thing, if it's a spot with few major components then letting the heat spread across the entire phone is even worse. Because it means the heat isn't actively being siphoned away from the components that are most affected by extreme temperatures. Over extended periods of time, that will lead to degradation and reduced performance and affect the phone's lifespan.</p><p>One thing I did notice when I accidentally closed 3DMark on the Z Fold 8 Ultra at the end of the test, is that the temperature started to drop pretty rapidly once the stress test stopped running. Which should mean that short periods of high-performance activity shouldn't pose a long-term problem. As long as you don't do it too often.</p><p>If you are doing anything performance heavy, make sure to take the appropriate measures to keep your phone as cool as possible. <a href="https://www.tomsguide.com/phones/9-tips-to-keep-your-phone-cool-during-a-heatwave-and-prevent-damage">Our tips for helping your phone survive a heatwave</a> will also apply here, which means avoiding direct sunlight, stop charging and so on. You can speed up the heat removal with things like fans or phone coolers, and you should absolutely avoid forcing your phone to cool down with appliances like the fridge — that's just going to cause even more issues.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/ive-tested-the-galaxy-z-fold-8-and-it-proves-apple-really-needs-to-solve-this-one-thing">I’ve tested the Galaxy Z Fold 8 and it proves Apple really needs to solve this one thing</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-the-new-galaxy-ai-video-tracker-on-my-z-fold-8">I tried the new Galaxy AI video tracker on my Z Fold 8 — and it fixes my biggest problem with phone videos</a></li><li><a href="https://www.tomsguide.com/phones/i-asked-siri-ai-and-gemini-a-series-of-increasingly-bizarre-questions-to-see-how-they-responded-heres-what-happened">I asked Siri AI and Gemini a series of increasingly bizarre questions to see how they responded —here's what happened</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-used-a-thermal-camera-to-see-how-hot-the-galaxy-z-fold-8-ultra-gets-compared-to-the-galaxy-s26-ultra-heres-what-happened</link>
                                                                            <description>
                            <![CDATA[ Galaxy Z Fold 8 Ultra lacks the same active cooling systems you'd find in the S26 Ultra and iPhone 17 Pro Max — and that could be a problem if you're doing performance-heavy work. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">BoNDJTiYyxadPKFBohbhwk</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/hALYgCgA465TXz5WYQn5RK-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 04 Aug 2026 08:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 04 Aug 2026 10:48:53 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/hALYgCgA465TXz5WYQn5RK-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 Ultra next to thermal imaging scan of the phone ]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 Ultra next to thermal imaging scan of the phone ]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 Ultra next to thermal imaging scan of the phone ]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/hALYgCgA465TXz5WYQn5RK-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung has packed a bunch of upgrades into the new <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>, but the one noticeable absence is the lack of any sort of active cooling system. The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a> has a built-in vapor chamber to prevent heat build-up, and similar features have existed in non-folding flagships for over a decade.</p><p>The question isn't why hasn't Samsung added a vapor chamber to its foldables yet, it's whether that actually matters. The Galaxy Z Fold 8 Ultra has the same super-powered <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-performance-face-off-snapdragon-8-elite-gen-5-vs-exynos-2600">Snapdragon 8 Elite Gen 5 for Galaxy chip </a>as the S26 Ultra, and I was curious how much heat would actually build up in both phones — and more importantly, where it ends up.</p><p>So I grabbed my trusty thermal camera, the <a href="https://www.tomsguide.com/opinion/i-used-this-thermal-camera-to-identify-heat-loss-in-my-home-heres-what-i-found">Flir One Pro</a>, and set up the Galaxy Z Fold 8 Ultra alongside the Galaxy S26 Ultra, <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a> and the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a> side by side. Then, by running <a href="https://www.3dmark.com/" target="_blank" rel="nofollow">3DMark's</a> Solar Bay Extreme Stress Test, I recorded just how much heat all four phones produced.</p><h2 id="is-it-getting-hot-in-here">Is it getting hot in 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:693px;"><p class="vanilla-image-block" style="padding-top:64.07%;"><img id="znB7Xvbzpp2dt6HgMwsjSj" name="ezgif-65d79b61dde731aa" alt="z fold 8 ultra thermal camera" src="https://cdn.mos.cms.futurecdn.net/znB7Xvbzpp2dt6HgMwsjSj-1920-80.gif" mos="" align="middle" fullscreen="" width="693" height="444" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Left to right: S26 Ultra, iPhone 17 Pro Max, Z Fold 8 Ultra, Z Fold 7 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>If you look at the video of all four phones, you can see that the Galaxy S26 Ultra starts heating up the fastest, hitting around 30C/86F in around a minute. The iPhone 17 Pro Max isn't that far behind, though the Z Fold 8 Ultra and Z Fold 7 both seem to be heating up a lot more slowly in their folded state.</p><p>The S26 Ultra seems to concentrate most of its heat in the top left corner, on the opposite side of the phone to the vertical camera bar. Meanwhile, the iPhone 17 Pro Max has a large section of heat across its top half, where the raised plateau camera bar is — which makes sense considering Apple designed the camera bar to help dissipate heat.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ZRLvLLAGituNoaESiU4oo9-1920-80.png" alt="z fold 8 ultra thermal camera test" /><figcaption>1 minute into testing<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bzj92un33KpMxAF44bHwo9-1920-80.png" alt="z fold 8 ultra thermal camera test" /><figcaption>4 minutes into testing<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/oX5iuHNRbkQxxyWEGvANp9-1920-80.png" alt="z fold 8 ultra thermal camera test" /><figcaption>9 minutes into testing<small role="credit">Future</small></figcaption></figure></figure><p>As the videos approach the 4-minute mark, the S26 Ultra starts to approach 40C/104F, while the two foldables only just hit 30C/86F. The iPhone isn't that far behind Samsung, and in the case of all four phones the heat seems to be mainly concentrated in the top half of each device. </p><p>By the time the 10-minute run is almost complete, parts of the S26 Ultra and iPhone have exceeded 40C/104F, while the foldables both seem to be hovering between 35C/95F and 37C/99F. At this stage the heat seems to have covered the entirety of the four phones, though only the iPhone and S26 Ultra have such high concentrations.</p><p>When I picked up the phones after closing 3DMark, I found that the S26 Ultra definitely felt the hottest, especially around the camera bar. Not quite enough to instantly burn yourself, but hot enough that you don't want prolonged exposure to it. The iPhone was similar, though didn't feel quite as hot, while the two foldables didn't feel that much different from normal.</p><h2 id="unfolding-the-heat">Unfolding the heat</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:601px;"><p class="vanilla-image-block" style="padding-top:64.89%;"><img id="4NBA7rCAbyzBwqtNsmwwVW" name="ezgif-6d4db9046320a37d" alt="z fold 8 ultra vs z fold 7 thermal camera test" src="https://cdn.mos.cms.futurecdn.net/4NBA7rCAbyzBwqtNsmwwVW-1920-80.gif" mos="" align="middle" fullscreen="" width="601" height="390" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Left: Galaxy Z Fold 8 Ultra. Right: Galaxy Z Fold 7 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Of course these readings were taken from the front of the phone, while the two foldables were all closed up. How much of a difference would unfolding them make? As it turns out, quite a lot.</p><p>As soon as the benchmarking test started, heat bloomed out of both phones in the top right — right where the camera bar is. Unsurprisingly given its more powerful hardware, the temperature climbed much higher on the Z Fold 8 Ultra, though the Z Fold 7 wasn't that far behind.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/g9wgFLhXViFwMhiYSLPDxG-1920-80.png" alt="z fold 8 ultra vs z fold 7 thermal test screenshots" /><figcaption>1 minute into testing<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/73eGhkiwfqAfgimrDBqfvG-1920-80.png" alt="z fold 8 ultra vs z fold 7 thermal test screenshots" /><figcaption>5 minutes into testing<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ookdm6idgGQ2qpSU3Z9etG-1920-80.png" alt="z fold 8 ultra vs z fold 7 thermal test screenshots" /><figcaption>10 minutes into testing<small role="credit">Future</small></figcaption></figure></figure><p>Within 20 seconds the temperature had jumped past 30C/89F, and after a minute the Z Fold 8 Ultra had already climbed past 40C/104F. 20 seconds later the Z Fold 7 joined it, and in both cases the heat was concentrated in the top right corner before slowly spreading out over both halves of the phones.</p><p>The temperature plateaued pretty quickly, landing a few degrees higher than 40C and hovering around that level. The majority of the heat remained concentrated on the right side of the phone too, with minimal transference  over to the left half. </p><p>This explains why the heat build-up seemed so slow in the previous test. The majority of the heat will have also been concentrated at the back of the device where the thermal camera couldn't pick it up as easily.</p><h2 id="verdict-2">Verdict</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="noN4XNdYP8ruPAPbWSqySm" name="PXL_20260723_153411133" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/noN4XNdYP8ruPAPbWSqySm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 Ultra can get pretty hot, but so does the Galaxy S26 Ultra and both phones seem to heat up to similar temperatures. Or, at least they did during identical Solar Bay Extreme Stress Tests — different processes will obviously have different effects.</p><p>The way the heat spread out was completely different, though. The Galaxy S26 Ultra recorded the highest temperatures in the top left side of the phone, on the opposite side of the phone to the cameras. Teardowns have revealed that this is where the vapor chamber cooling pushes the excess heat, so it's natural that this would see the most extreme temperatures. The same goes for the iPhone 17 Pro Max and its own raised camera bar.</p><p>The unfolded stress test showed that the Z Fold 8 Ultra (and Z Fold 7) don't have that advantage. While the heat appears in that top corner by the cameras, it quickly spreads across the entire right side of the phone. Apparently, the heat struggled to bypass the hinge, which is an interesting observation.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OqRVBX"></div>                            </div>                            <script src="https://kwizly.com/embed/OqRVBX.js" async></script><p>In the case of the Z Fold 8 Ultra the heat isn't being actively routed away from core internal components — like the battery or chipset. That means it has no choice but to spread out until it reaches the edge of the phone and radiates away. You can actually see that happening in the thermal video as the heat spreads out from the very top of the phone.</p><p>While concentrating the heat in one area seems like a bad thing, if it's a spot with few major components then letting the heat spread across the entire phone is even worse. Because it means the heat isn't actively being siphoned away from the components that are most affected by extreme temperatures. Over extended periods of time, that will lead to degradation and reduced performance and affect the phone's lifespan.</p><p>One thing I did notice when I accidentally closed 3DMark on the Z Fold 8 Ultra at the end of the test, is that the temperature started to drop pretty rapidly once the stress test stopped running. Which should mean that short periods of high-performance activity shouldn't pose a long-term problem. As long as you don't do it too often.</p><p>If you are doing anything performance heavy, make sure to take the appropriate measures to keep your phone as cool as possible. <a href="https://www.tomsguide.com/phones/9-tips-to-keep-your-phone-cool-during-a-heatwave-and-prevent-damage">Our tips for helping your phone survive a heatwave</a> will also apply here, which means avoiding direct sunlight, stop charging and so on. You can speed up the heat removal with things like fans or phone coolers, and you should absolutely avoid forcing your phone to cool down with appliances like the fridge — that's just going to cause even more issues.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/iphones/ive-tested-the-galaxy-z-fold-8-and-it-proves-apple-really-needs-to-solve-this-one-thing">I’ve tested the Galaxy Z Fold 8 and it proves Apple really needs to solve this one thing</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-the-new-galaxy-ai-video-tracker-on-my-z-fold-8">I tried the new Galaxy AI video tracker on my Z Fold 8 — and it fixes my biggest problem with phone videos</a></li><li><a href="https://www.tomsguide.com/phones/i-asked-siri-ai-and-gemini-a-series-of-increasingly-bizarre-questions-to-see-how-they-responded-heres-what-happened">I asked Siri AI and Gemini a series of increasingly bizarre questions to see how they responded —here's what happened</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ iPhone Ultra vs Galaxy Z Fold 8 — here's 3 big ways Apple could win ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win"><u>Galaxy Z Fold 8</u></a> is getting pretty positive review, and it looks like this wide format device is the shape of foldable phones to come. That includes the iPhone Ultra, which is expected to launch this fall.</p><p>Based on the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone?utm_source=google&utm_medium=h5d&utm_campaign=h_tg_00284&gad_source=1&gad_campaignid=22851877377&gbraid=0AAAAAqzfqMbEgt7haejazcQhI_4dGXhNJ&gclid=Cj0KCQjw-MDTBhCgARIsAKAkdlQY7GWAahIQGfnQYM7FwAvIKa1pRNqQmyrDQr8CgrR9CgYXuoH6sFMaAsxXEALw_wcB"><u>iPhone Ultra</u></a> (aka iPhone Fold) rumors thus far, it looks like Apple’s device is going to be slightly heavier and thicker but sport a very similar passport-style design. So how is Apple going to stand out, especially with an asking price that could reach $2,400 or $2,500 — at least $500 more than Samsung’s device? Here’s three ways the iPhone Ultra could beat the Galaxy Z Fold 8.</p><h2 id="no-crease-at-all">No crease at all?!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2188px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Yi3SX3rGdTkh5HdALu76vY" name="Galaxy Z Fold 8 review-LIST2" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/Yi3SX3rGdTkh5HdALu76vY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2188" height="1231" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy Z Fold 8 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung worked to greatly minimize the appearance of the crease on the Fold 8. And the result is indeed impressive.</p><p>Thanks to <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous"><u>Flex Titanium technology,</u></a> the Fold 8’s display uses a titanium-alloy film to achieve a more stretchable panel. Meanwhile, a titanium plate supports the display module from beneath, allowing for tighter bonding and eliminating air gaps.</p><p>The crease is still there, but it’s less noticeable than on the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"><u>Fold 7</u></a>. However, Apple is apparently working on a truly <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-achieves-a-visually-crease-free-state-according-to-leaker-but-fears-over-the-hinge-could-lead-to-delays"><u>crease-free display for the iPhone Ultra</u></a> and is reportedly partnering with Samsung Display to make it happen.</p><p>Apple is apparently pulling this off by employing <a href="https://www.tomsguide.com/phones/foldable-iphone-just-tipped-for-revolutionary-liquid-metal-hinge"><u>liquid metal</u></a> alloy components inside the hinge mechanism. At the same time, Apple is reportedly working on a laser-drilled display metal plate to redistribute stress evenly across a wider bending zone.</p><h2 id="fully-optimized-apps">Fully optimized apps</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3137px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="r7n3onFcjSMt3bPTKf6mV6" name="Galaxy Z Fold 8-2" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/r7n3onFcjSMt3bPTKf6mV6-1920-80.jpg" mos="" align="middle" fullscreen="" width="3137" height="1765" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is likely going to be the biggest difference between the iPhone Ultra and Galaxy Z Fold 8. There are plenty of apps that are optimized for the Fold 8’s 7.6-inch display with a dual-pane layout, such as Gmail, Calendar, YouTube and TikTok.</p><p>I especially like how you can watch vertical videos on one side while looking at comments on the other on TikTok, but on YouTube Shorts you have to close comments to keep scrolling, which is dumb.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3373px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="bk23tNRKPm59GMBqiiEdR6" name="Galaxy Z Fold 8" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/bk23tNRKPm59GMBqiiEdR6-1920-80.jpg" mos="" align="middle" fullscreen="" width="3373" height="1897" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, there are also several high-profile apps on the Fold 8 that look like stretched-out phone apps. This includes X, with a lot of wasted space on either side of the content area. With Slack, you don’t get a dual-pane layout, which you do get on the iPad mini. And on Instagram, the comments cover the content (for now).</p><p>The iPhone Ultra likely won’t have this problem, as it will <a href="https://www.tomsguide.com/phones/iphones/forget-running-a-single-app-foldable-iphone-leak-reveals-an-absolute-multitasking-overhaul"><u>reportedly offer the same app scaling benefits as iPads</u></a>, even if it’s still running iOS. Samsung says that Instagram’s layout will get an update sometime between July and August, which is nice, but there will still be lots and lots of apps that will “just work” on the iPhone Ultra on day one.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdRwme"></div>                            </div>                            <script src="https://kwizly.com/embed/OdRwme.js" async></script><h2 id="more-efficient-chip">More efficient chip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2693px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="xsfHUrdQAp5k99yND4fgSY" name="Galaxy Z Fold 8 review-26" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xsfHUrdQAp5k99yND4fgSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2693" height="1515" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy Z Fold 8 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you believe the rumors, the iPhone Ultra and Galaxy Z Fold 8 are going to have similar size batteries. The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal"><u>Fold 8 has a 4,800 mAh battery with silicon carbon tech</u></a>, while the iPhone Ultra is tipped to pack a 4,883 mAh split dual-cell battery that may also use silicon carbon.</p><p>So at least on paper the iPhone Ultra and Fold 8 have similar battery capacity. But Apple’s <a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models"><u>A20 Pro chip</u></a> could make a big difference. The chip will likely use a 2nm process, making it more efficient than the 3nm Snapdragon 8 Elite Gen 5 processor.</p><p>That efficiency should turn into more endurance, and the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off"><u>Fold 8 already turned in a very good runtime of 14.5 hours in our battery test</u></a>. We’ll see how much of a boost the A20 Pro provides.</p><h2 id="what-about-the-iphone-ultra-price">What about the iPhone Ultra price?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1964px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="jKyo3FUB76apN2dfooDL9d" name="iPhone Fold render edit 1-2" alt="Renders of the potential iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/jKyo3FUB76apN2dfooDL9d-1920-80.jpg" mos="" align="middle" fullscreen="" width="1964" height="1105" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: FPT)</span></figcaption></figure><p>Assuming Apple has these three major advantages over the Galaxy Z Fold 8, there’s still the price to contend with. The latest rumors have the iPhone Fold costing over $2,000 with some estimates putting in the <a href="https://www.tomsguide.com/phones/iphones/apple-expects-10-million-people-to-buy-a-usd2-500-iphone-ultra-and-its-a-huge-gamble"><u>$2,400 to $2,500 range</u></a>.</p><p>That would be as much as $600 more than the $1,900 Galaxy Z Fold 8. But Apple has another secret weapon up its sleeve in the recently announced <a href="https://www.tomsguide.com/ai/chatgpt/is-the-apple-upgrade-program-a-good-deal-or-a-rip-off-i-asked-chatgpt-to-crunch-the-numbers-and-heres-the-verdict"><u>Apple Upgrade program</u></a>. It will be able to entice buyers with lower monthly payments to help spread the cost out over time, even though it’s just a glorified leasing program.</p><h2 id="iphone-ultra-vs-galaxy-z-fold-8-outlook">iPhone Ultra vs. Galaxy Z Fold 8: Outlook</h2><p>The Samsung Galaxy Z Fold 8 has raised the bar for wide-screen foldables with its super light and thin design, as well as smart AI upgrades like Now Nudge and My FanCam. It’s a very good foldable.</p><p>However, the iPhone Ultra could surpass the Fold 8 with an even less noticeable crease, a much better app experience and even longer battery life. </p><p>Which foldable would you buy? Let me know in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win"><strong>Samsung Galaxy Z Fold 8 review: Pros and cons</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off"><strong>Battery life tested: How the Galaxy Z Fold 8 stacks up</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-delay-leak-right-after-samsungs-triumphant-galaxy-fold-8-launch-has-me-sick-of-waiting-for-apples-foldable"><strong>iPhone Ultra delay leak right after Samsung's triumphant Galaxy Fold 8 launch has me sick of waiting for Apple's foldable</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/3-big-ways-the-iphone-ultra-could-beat-the-galaxy-z-fold-8</link>
                                                                            <description>
                            <![CDATA[ The iPhone Ultra could surpass the Galaxy Z Fold 8 when it launches this fall, and it has more to do with software than hardware. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7m6dp8ciXTkXvvpxmVz8b9</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TqghRh7x9BK6X2sbvwSBEY-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 04 Aug 2026 05:00:00 +0000</pubDate>                                                                                                                                <updated>Tue, 04 Aug 2026 13:20:34 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[iPhones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/TqghRh7x9BK6X2sbvwSBEY-1920-80.jpg">
                                                            <media:credit><![CDATA[Majin Bu/X/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Concept art for a foldable iPhone and the Galaxy Z Fold 8 shown in hand]]></media:description>                                                            <media:text><![CDATA[Concept art for a foldable iPhone and the Galaxy Z Fold 8 shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Concept art for a foldable iPhone and the Galaxy Z Fold 8 shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TqghRh7x9BK6X2sbvwSBEY-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win"><u>Galaxy Z Fold 8</u></a> is getting pretty positive review, and it looks like this wide format device is the shape of foldable phones to come. That includes the iPhone Ultra, which is expected to launch this fall.</p><p>Based on the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone?utm_source=google&utm_medium=h5d&utm_campaign=h_tg_00284&gad_source=1&gad_campaignid=22851877377&gbraid=0AAAAAqzfqMbEgt7haejazcQhI_4dGXhNJ&gclid=Cj0KCQjw-MDTBhCgARIsAKAkdlQY7GWAahIQGfnQYM7FwAvIKa1pRNqQmyrDQr8CgrR9CgYXuoH6sFMaAsxXEALw_wcB"><u>iPhone Ultra</u></a> (aka iPhone Fold) rumors thus far, it looks like Apple’s device is going to be slightly heavier and thicker but sport a very similar passport-style design. So how is Apple going to stand out, especially with an asking price that could reach $2,400 or $2,500 — at least $500 more than Samsung’s device? Here’s three ways the iPhone Ultra could beat the Galaxy Z Fold 8.</p><h2 id="no-crease-at-all">No crease at all?!</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2188px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="Yi3SX3rGdTkh5HdALu76vY" name="Galaxy Z Fold 8 review-LIST2" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/Yi3SX3rGdTkh5HdALu76vY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2188" height="1231" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy Z Fold 8 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung worked to greatly minimize the appearance of the crease on the Fold 8. And the result is indeed impressive.</p><p>Thanks to <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous"><u>Flex Titanium technology,</u></a> the Fold 8’s display uses a titanium-alloy film to achieve a more stretchable panel. Meanwhile, a titanium plate supports the display module from beneath, allowing for tighter bonding and eliminating air gaps.</p><p>The crease is still there, but it’s less noticeable than on the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"><u>Fold 7</u></a>. However, Apple is apparently working on a truly <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-achieves-a-visually-crease-free-state-according-to-leaker-but-fears-over-the-hinge-could-lead-to-delays"><u>crease-free display for the iPhone Ultra</u></a> and is reportedly partnering with Samsung Display to make it happen.</p><p>Apple is apparently pulling this off by employing <a href="https://www.tomsguide.com/phones/foldable-iphone-just-tipped-for-revolutionary-liquid-metal-hinge"><u>liquid metal</u></a> alloy components inside the hinge mechanism. At the same time, Apple is reportedly working on a laser-drilled display metal plate to redistribute stress evenly across a wider bending zone.</p><h2 id="fully-optimized-apps">Fully optimized apps</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3137px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="r7n3onFcjSMt3bPTKf6mV6" name="Galaxy Z Fold 8-2" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/r7n3onFcjSMt3bPTKf6mV6-1920-80.jpg" mos="" align="middle" fullscreen="" width="3137" height="1765" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>This is likely going to be the biggest difference between the iPhone Ultra and Galaxy Z Fold 8. There are plenty of apps that are optimized for the Fold 8’s 7.6-inch display with a dual-pane layout, such as Gmail, Calendar, YouTube and TikTok.</p><p>I especially like how you can watch vertical videos on one side while looking at comments on the other on TikTok, but on YouTube Shorts you have to close comments to keep scrolling, which is dumb.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3373px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="bk23tNRKPm59GMBqiiEdR6" name="Galaxy Z Fold 8" alt="Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/bk23tNRKPm59GMBqiiEdR6-1920-80.jpg" mos="" align="middle" fullscreen="" width="3373" height="1897" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>However, there are also several high-profile apps on the Fold 8 that look like stretched-out phone apps. This includes X, with a lot of wasted space on either side of the content area. With Slack, you don’t get a dual-pane layout, which you do get on the iPad mini. And on Instagram, the comments cover the content (for now).</p><p>The iPhone Ultra likely won’t have this problem, as it will <a href="https://www.tomsguide.com/phones/iphones/forget-running-a-single-app-foldable-iphone-leak-reveals-an-absolute-multitasking-overhaul"><u>reportedly offer the same app scaling benefits as iPads</u></a>, even if it’s still running iOS. Samsung says that Instagram’s layout will get an update sometime between July and August, which is nice, but there will still be lots and lots of apps that will “just work” on the iPhone Ultra on day one.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OdRwme"></div>                            </div>                            <script src="https://kwizly.com/embed/OdRwme.js" async></script><h2 id="more-efficient-chip">More efficient chip</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2693px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="xsfHUrdQAp5k99yND4fgSY" name="Galaxy Z Fold 8 review-26" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xsfHUrdQAp5k99yND4fgSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2693" height="1515" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Galaxy Z Fold 8 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If you believe the rumors, the iPhone Ultra and Galaxy Z Fold 8 are going to have similar size batteries. The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal"><u>Fold 8 has a 4,800 mAh battery with silicon carbon tech</u></a>, while the iPhone Ultra is tipped to pack a 4,883 mAh split dual-cell battery that may also use silicon carbon.</p><p>So at least on paper the iPhone Ultra and Fold 8 have similar battery capacity. But Apple’s <a href="https://www.tomsguide.com/phones/iphones/iphone-18-countdown-starts-now-5-rumored-upgrades-apple-could-be-giving-its-pro-models"><u>A20 Pro chip</u></a> could make a big difference. The chip will likely use a 2nm process, making it more efficient than the 3nm Snapdragon 8 Elite Gen 5 processor.</p><p>That efficiency should turn into more endurance, and the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off"><u>Fold 8 already turned in a very good runtime of 14.5 hours in our battery test</u></a>. We’ll see how much of a boost the A20 Pro provides.</p><h2 id="what-about-the-iphone-ultra-price">What about the iPhone Ultra price?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1964px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="jKyo3FUB76apN2dfooDL9d" name="iPhone Fold render edit 1-2" alt="Renders of the potential iPhone foldable device" src="https://cdn.mos.cms.futurecdn.net/jKyo3FUB76apN2dfooDL9d-1920-80.jpg" mos="" align="middle" fullscreen="" width="1964" height="1105" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: FPT)</span></figcaption></figure><p>Assuming Apple has these three major advantages over the Galaxy Z Fold 8, there’s still the price to contend with. The latest rumors have the iPhone Fold costing over $2,000 with some estimates putting in the <a href="https://www.tomsguide.com/phones/iphones/apple-expects-10-million-people-to-buy-a-usd2-500-iphone-ultra-and-its-a-huge-gamble"><u>$2,400 to $2,500 range</u></a>.</p><p>That would be as much as $600 more than the $1,900 Galaxy Z Fold 8. But Apple has another secret weapon up its sleeve in the recently announced <a href="https://www.tomsguide.com/ai/chatgpt/is-the-apple-upgrade-program-a-good-deal-or-a-rip-off-i-asked-chatgpt-to-crunch-the-numbers-and-heres-the-verdict"><u>Apple Upgrade program</u></a>. It will be able to entice buyers with lower monthly payments to help spread the cost out over time, even though it’s just a glorified leasing program.</p><h2 id="iphone-ultra-vs-galaxy-z-fold-8-outlook">iPhone Ultra vs. Galaxy Z Fold 8: Outlook</h2><p>The Samsung Galaxy Z Fold 8 has raised the bar for wide-screen foldables with its super light and thin design, as well as smart AI upgrades like Now Nudge and My FanCam. It’s a very good foldable.</p><p>However, the iPhone Ultra could surpass the Fold 8 with an even less noticeable crease, a much better app experience and even longer battery life. </p><p>Which foldable would you buy? Let me know in the comments.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><strong></strong><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win"><strong>Samsung Galaxy Z Fold 8 review: Pros and cons</strong></a><strong></strong></li><li><strong></strong><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off"><strong>Battery life tested: How the Galaxy Z Fold 8 stacks up</strong></a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-delay-leak-right-after-samsungs-triumphant-galaxy-fold-8-launch-has-me-sick-of-waiting-for-apples-foldable"><strong>iPhone Ultra delay leak right after Samsung's triumphant Galaxy Fold 8 launch has me sick of waiting for Apple's foldable</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy S27 Ultra leak reveals silicon carbon battery leap — but also a camera downgrade ]]></title>
                                                                                                <dc:content><![CDATA[ <p>When Samsung launches the Galaxy S27 Ultra early next year, the flagship phone could be much different phone compared to the Galaxy S26 Ultra. A slew of rumors and confirmed news in the last few days revealed one massive upgrade and at least two potential downgrades.</p><p>First, the upgrade with the rumored debut of a<a href="https://www.tomsguide.com/phones/i-interviewed-honor-and-oneplus-about-their-silicon-carbon-battery-tech-apple-and-google-are-quickly-falling-behind"> silicon-carbon battery</a> in the S27 series. This news isn't totally surprising as Samsung <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal">finally put this newer battery</a> technology in the recently launched <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">Z Fold 8 Ultra</a>.</p><p>The rumor comes from two different sources: <a href="https://x.com/TheGalox_/status/2083323737441509409" target="_blank">The Galox</a> on X and YouTuber <a href="https://www.youtube.com/shorts/_-pu1xDAKHc" target="_blank">TechDroider</a>. Both claimed that the S27 Ultra will get a 5700 mAh silicon-carbon battery.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exVvlO"></div>                            </div>                            <script src="https://kwizly.com/embed/exVvlO.js" async></script><p>If the battery rumor is true this would be the first capacity upgrade to the Ultra model since the <a href="https://www.tomsguide.com/reviews/galaxy-s20-ultra">Galaxy S20 Ultra</a>. That's seven generations of phones with essentially the exact same battery. </p><p>While Chinese phone makers have been pushing silicon carbon battery equipped devices since 2024, Samsung has taken a more conservative approach. </p><p>“We have been testing silicon batteries for quite some time. We’re looking at being very — I wouldn’t say conservative — but more taking it one step at a time," Samsung's Jay Kim — the executive VP of the Galaxy Z Fold 8 series — <a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">told Tom's Guide Mark Spoonauer</a>.</p><p>Still, the new battery bumped the Z Fold 8 Ultra up to 5,000 mAh, a big boost from the 4,400 mAh lithium ion in the Fold 7. </p><p>It doesn't necessarily mean Samsung was always going to put a silicon-carbon battery in its main phone line but signs are looking good.</p><h2 id="worse-cameras">Worse cameras</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3780px;"><p class="vanilla-image-block" style="padding-top:101.38%;"><img id="D6paXuMoJpDcDAamp5DbtW" name="HOlz5UdWMAAsNIA" alt="Samsung Galaxy S27 Ultra rumored camera array" src="https://cdn.mos.cms.futurecdn.net/D6paXuMoJpDcDAamp5DbtW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3780" height="3832" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: The Galox)</span></figcaption></figure><p>One of The Galox's rumored specs is a 50MP 5x telephoto lens and a second telephoto camera in the S27 Ultra. However, regular Samsung <a href="https://x.com/UniverseIce/status/2083437964491919516" target="_blank">leaker Ice Universe</a> threw some water on the rumor claiming that there will be no second telephoto camera. </p><p>If true that would be a downgrade from the current setup which features a 200MP main, 10MP telephoto, 50MP periscope telephoto and a 50MP ultrawide. Per Ice Universe, the S27 Ultra would drop the 10MP telephoto lens. </p><p>At the same time, <a href="https://x.com/UniverseIce/status/2084224549751865612" target="_blank">Ice put up another post</a> asserting that Samsung is using inkjet printing technology to make the camera module thinner. This could make the camera array smaller overall. </p><p>One of the flaws of the S26 Ultra is its massive camera bump, which makes it impossible to set the phone down flat anywhere. As an S26 Ultra owner, it's one of the more annoying aspects of the phone.</p><p>If I'm being honest, I'd rather have the smaller camera bump than an extra telephoto lens.</p><p>Beyond that, both The Galox and TechDroid suggested that the camera array could spread across the entire width of the phone mimicking what Apple did with the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro</a> models. If the S27 Ultra is missing the fourth camera, it seems the iPhone and Galaxy phones will be nearly indistinguishable.</p><h2 id="higher-prices">Higher prices</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CG3BK779yQswJXv5M7Rfyg" name="Galaxy Unpacked July 2026_ Official Livestream 2-14-17 screenshot" alt="Snapdragon 8 Elite for Galaxy" src="https://cdn.mos.cms.futurecdn.net/CG3BK779yQswJXv5M7Rfyg-1920-80.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Unfortunately, next year's Galaxy S27 Ultra is likely to be more expensive.  Samsung managed to keep the starting price of the S26 Ultra at $1,299 the same as the S25 Ultra. </p><p>However, late last week, Qualcomm CEO Cristiano Amon <a href="https://www.cnbc.com/2026/07/29/qualcomm-qcom-earnings-report-q3-2026-.html" target="_blank">confirmed to CNBC</a> that it will increase prices for its Snapdragon silicon. This means the costs will be put on smartphone makers like Samsung, which can't even get its own memory division to lower prices for the mobile division.</p><p>“Cost went up, prices are going to go up,” Amon told CNBC. Amon specifically blamed the supply constraints on memory for the increase. He did say the price increase was "temporary," but with the AI-driven RAM crisis not expected to abate until 2028 at the earliest, it's not clear how long this "temporary" hike will last.</p><p>Still, it means the next Samsung phone will likely be more expensive. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/the-tech-world-hyped-up-the-galaxy-z-fold-8s-crease-free-display-heres-a-reality-check-after-7-days">The tech world hyped up the Galaxy Z Fold 8's 'crease-free' display — here's a reality check after 7 days</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-the-new-galaxy-ai-video-tracker-on-my-z-fold-8">I tried the new Galaxy AI video tracker on my Z Fold 8 — and it fixes my biggest problem with phone videos</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Samsung Galaxy Z Flip 8 review: More expensive, barely different</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s27-ultra-leak-reveals-silicon-carbon-battery-leap-but-also-a-camera-downgrade</link>
                                                                            <description>
                            <![CDATA[ Samsung's flagship Galaxy S27 Ultra is rumored to make a massive leap, but the cameras could be downgraded, so which is more important: a bigger battery or a better camera? ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">tJJQghLXuhhaHVGZyW7vvK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CW5iTknLhN6oiVMPk7Z7xL-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 03 Aug 2026 17:25:18 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ scott.younker@futurenet.com (Scott Younker) ]]></author>                    <dc:creator><![CDATA[ Scott Younker ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/RZsUpqcJ6Uj2q83oCUwNhQ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Scott Younker is the West Coast Reporter at Tom’s Guide. He covers all the latest tech news, including phones, computing and more. He’s been involved in tech since 2011 covering everything from cameras and swimming pool equipment to the latest gaming consoles and smart TVs. He is on a seemingly never ending hunt to build the easiest to use home media system. &lt;/p&gt;&lt;p&gt;Before Tom’s Guide, Scott worked for publications like &lt;em&gt;Digital Trends, Outdoor Photographer, Dead Beats Panel&lt;/em&gt;, and in a brief detour, &lt;em&gt;America’s Funniest Home Videos&lt;/em&gt;. Yes, he has seen more pratfalls, silly pets and ridiculous home movie fails than is reasonably healthy. &lt;/p&gt;&lt;p&gt;When not writing about the latest devices or advances in chipsets, be sure to ask about Scott about disc golf and sustainability, or just if you’re being cheeky, ask about his noodle arm. If you truly want to get nerdy, bring up board games and his ongoing losing streak. &lt;/p&gt;&lt;p&gt;Scott joined Tom&#039;s Guide in 2024 as the West Coast Reporter. He graduated from the School of Journalism at the University of Oregon with a degree in magazine journalism and a minor in communications. While there he blogged or wrote for several magazines including the Fluxx, Ethos and the Oregon Commentator. He briefly wrote and managed a moderately successful blog focused on web comics. &lt;/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/CW5iTknLhN6oiVMPk7Z7xL-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy S26 Ultra shown in hand]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy S26 Ultra shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy S26 Ultra shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CW5iTknLhN6oiVMPk7Z7xL-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>When Samsung launches the Galaxy S27 Ultra early next year, the flagship phone could be much different phone compared to the Galaxy S26 Ultra. A slew of rumors and confirmed news in the last few days revealed one massive upgrade and at least two potential downgrades.</p><p>First, the upgrade with the rumored debut of a<a href="https://www.tomsguide.com/phones/i-interviewed-honor-and-oneplus-about-their-silicon-carbon-battery-tech-apple-and-google-are-quickly-falling-behind"> silicon-carbon battery</a> in the S27 series. This news isn't totally surprising as Samsung <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal">finally put this newer battery</a> technology in the recently launched <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">Z Fold 8 Ultra</a>.</p><p>The rumor comes from two different sources: <a href="https://x.com/TheGalox_/status/2083323737441509409" target="_blank">The Galox</a> on X and YouTuber <a href="https://www.youtube.com/shorts/_-pu1xDAKHc" target="_blank">TechDroider</a>. Both claimed that the S27 Ultra will get a 5700 mAh silicon-carbon battery.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-exVvlO"></div>                            </div>                            <script src="https://kwizly.com/embed/exVvlO.js" async></script><p>If the battery rumor is true this would be the first capacity upgrade to the Ultra model since the <a href="https://www.tomsguide.com/reviews/galaxy-s20-ultra">Galaxy S20 Ultra</a>. That's seven generations of phones with essentially the exact same battery. </p><p>While Chinese phone makers have been pushing silicon carbon battery equipped devices since 2024, Samsung has taken a more conservative approach. </p><p>“We have been testing silicon batteries for quite some time. We’re looking at being very — I wouldn’t say conservative — but more taking it one step at a time," Samsung's Jay Kim — the executive VP of the Galaxy Z Fold 8 series — <a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">told Tom's Guide Mark Spoonauer</a>.</p><p>Still, the new battery bumped the Z Fold 8 Ultra up to 5,000 mAh, a big boost from the 4,400 mAh lithium ion in the Fold 7. </p><p>It doesn't necessarily mean Samsung was always going to put a silicon-carbon battery in its main phone line but signs are looking good.</p><h2 id="worse-cameras">Worse cameras</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3780px;"><p class="vanilla-image-block" style="padding-top:101.38%;"><img id="D6paXuMoJpDcDAamp5DbtW" name="HOlz5UdWMAAsNIA" alt="Samsung Galaxy S27 Ultra rumored camera array" src="https://cdn.mos.cms.futurecdn.net/D6paXuMoJpDcDAamp5DbtW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3780" height="3832" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: The Galox)</span></figcaption></figure><p>One of The Galox's rumored specs is a 50MP 5x telephoto lens and a second telephoto camera in the S27 Ultra. However, regular Samsung <a href="https://x.com/UniverseIce/status/2083437964491919516" target="_blank">leaker Ice Universe</a> threw some water on the rumor claiming that there will be no second telephoto camera. </p><p>If true that would be a downgrade from the current setup which features a 200MP main, 10MP telephoto, 50MP periscope telephoto and a 50MP ultrawide. Per Ice Universe, the S27 Ultra would drop the 10MP telephoto lens. </p><p>At the same time, <a href="https://x.com/UniverseIce/status/2084224549751865612" target="_blank">Ice put up another post</a> asserting that Samsung is using inkjet printing technology to make the camera module thinner. This could make the camera array smaller overall. </p><p>One of the flaws of the S26 Ultra is its massive camera bump, which makes it impossible to set the phone down flat anywhere. As an S26 Ultra owner, it's one of the more annoying aspects of the phone.</p><p>If I'm being honest, I'd rather have the smaller camera bump than an extra telephoto lens.</p><p>Beyond that, both The Galox and TechDroid suggested that the camera array could spread across the entire width of the phone mimicking what Apple did with the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro</a> models. If the S27 Ultra is missing the fourth camera, it seems the iPhone and Galaxy phones will be nearly indistinguishable.</p><h2 id="higher-prices">Higher prices</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1920px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="CG3BK779yQswJXv5M7Rfyg" name="Galaxy Unpacked July 2026_ Official Livestream 2-14-17 screenshot" alt="Snapdragon 8 Elite for Galaxy" src="https://cdn.mos.cms.futurecdn.net/CG3BK779yQswJXv5M7Rfyg-1920-80.png" mos="" align="middle" fullscreen="" width="1920" height="1080" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Samsung)</span></figcaption></figure><p>Unfortunately, next year's Galaxy S27 Ultra is likely to be more expensive.  Samsung managed to keep the starting price of the S26 Ultra at $1,299 the same as the S25 Ultra. </p><p>However, late last week, Qualcomm CEO Cristiano Amon <a href="https://www.cnbc.com/2026/07/29/qualcomm-qcom-earnings-report-q3-2026-.html" target="_blank">confirmed to CNBC</a> that it will increase prices for its Snapdragon silicon. This means the costs will be put on smartphone makers like Samsung, which can't even get its own memory division to lower prices for the mobile division.</p><p>“Cost went up, prices are going to go up,” Amon told CNBC. Amon specifically blamed the supply constraints on memory for the increase. He did say the price increase was "temporary," but with the AI-driven RAM crisis not expected to abate until 2028 at the earliest, it's not clear how long this "temporary" hike will last.</p><p>Still, it means the next Samsung phone will likely be more expensive. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/the-tech-world-hyped-up-the-galaxy-z-fold-8s-crease-free-display-heres-a-reality-check-after-7-days">The tech world hyped up the Galaxy Z Fold 8's 'crease-free' display — here's a reality check after 7 days</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-the-new-galaxy-ai-video-tracker-on-my-z-fold-8">I tried the new Galaxy AI video tracker on my Z Fold 8 — and it fixes my biggest problem with phone videos</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review">Samsung Galaxy Z Flip 8 review: More expensive, barely different</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried the new Galaxy AI video tracker on my Z Fold 8 — and it fixes my biggest problem with phone videos ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I'm far from a good videographer (which is one of the reasons I've remained a writer-first in this era of Reels, TikToks, and Shorts). But that doesn't mean I don't record videos on my phone. Whenever I'm at a concert, a game, or any kind of event, I still find myself pulling out my phone to capture the moment. </p><p>The problem is that I'm terrible at keeping the camera locked on my subject. Filming a performer from way out in a crowd is quite difficult, especially when you're zoomed in. </p><p>Samsung's new <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">foldable phones</a> come with a new Galaxy AI video tracker feature that is designed to solve exactly that problem. I spent some time trying it on my <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, and I can confidently say it made filming way easier — even if there's still one thing I'd like Samsung to improve.</p><div data-widget-type="multimodelreview" data-model-name="Samsung Galaxy Z Fold 8,Samsung Galaxy Z Fold 8 Ultra,Samsung Galaxy Z Flip 8"></div><h2 id="how-samsung-s-my-fancam-ai-feature-actually-works">How Samsung's My FanCam AI feature actually works</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fAx6nqTj5uQitRwaywVdKc" name="z-fold-8-fancam-2" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/fAx6nqTj5uQitRwaywVdKc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>What My FanCam essentially does is take away the stress of trying to keep a moving subject perfectly framed throughout a video. Instead of manually tracking someone while you're recording, Galaxy AI can detect a person in your video after you've finished filming and automatically follow them throughout the clip.</p><p>The end result is a new video that stays focused on that one person, almost as if someone had tracked them with the camera the entire time. </p><p>Using it is fairly straightforward. First, record a video using the Camera app on your Galaxy phone as you normally would. Once you're done, open the video in the <strong>Samsung Gallery app</strong>, tap the <strong>Galaxy AI icon</strong>, and select <strong>My FanCam</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="q6wnzsH6AZnGCuG5Wms56c" name="z-fold-8-fancam-5" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/q6wnzsH6AZnGCuG5Wms56c-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Galaxy AI will then scan the video and <strong>detect the different people in the frame</strong>. Once it's finished, you'll see touch targets appear over each detected person. Simply tap the subject you want Galaxy AI to follow. </p><p>Before exporting the video, Samsung also lets you <strong>choose the aspect ratio</strong>. For vertical videos, 9:16 is selected by default, but you can also choose options like 1:1, 3:4, and a few others. </p><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="BKuYJAmt7SFTZcMMhZcz3c" name="z-fold-8-fancam-6" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/BKuYJAmt7SFTZcMMhZcz3c-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Once you've made your selection, tap <strong>Follow</strong>, and Galaxy AI will generate a brand-new video that keeps your chosen subject in frame throughout the clip. You can then preview the result and, if you're happy with it, <strong>Save Copy</strong> to your gallery.</p><h2 id="my-fancam-worked-far-better-than-i-expected-during-my-testing">My FanCam worked far better than I expected during my testing</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/ioP8RU8CD4E" allowfullscreen></iframe></div></div><p>In my testing, the feature worked great and kept track of my subject impressively well. In a way, it reminded me of Apple's Center Stage, except instead of working during live video calls, My FanCam works on pre-recorded videos, and it works on multiple people in the same clip.  </p><p>The AI processing itself is also fairly quick. Samsung says the processing time depends on the length of the clip, but all of the videos I tested were processed within a matter of seconds. </p><p>Another nice touch is that it works on older videos already sitting in your gallery, so you're not limited to footage you shot after you got your new phone. This means you can go back and create FanCam videos from footage you've already captured. </p><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="yLjnZ8oc2DUgEraGBmovKc" name="z-fold-8-fancam-3" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/yLjnZ8oc2DUgEraGBmovKc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>My biggest complaint right now is that it's exclusive to the Galaxy Z8 series phones. And the cameras, at least on the regular Galaxy Z Fold 8, aren't the sharpest. That means if you're tracking a subject that's far away, the footage can come out looking slightly pixelated once the feature crops and zooms into your subject. </p><p>I think Samsung could take this feature a step further by using Galaxy AI to enhance the final output, especially when the video has been cropped heavily. A little AI sharpening or detail enhancement can take this feature up a notch.</p><p>Even so, I still love the feature in its current form. The fact that Samsung is using AI to automatically track a subject after you've already recorded the video is incredibly useful. I also think it would make even more sense on higher-end Galaxy phones like the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-ultra-vs-galaxy-s25-ultra">Galaxy S26 Ultra</a>, where the better camera hardware would give the AI much more detail to work with. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ORMNzW"></div>                            </div>                            <script src="https://kwizly.com/embed/ORMNzW.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/phones/samsung-phones/i-just-realized-the-samsung-galaxy-z-fold-8-ultra-fixes-the-worst-thing-about-fingerprint-scanners">I just realized the Samsung Galaxy Z Fold 8 Ultra fixes the worst thing about fingerprint scanners</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-tried-the-new-galaxy-ai-video-tracker-on-my-z-fold-8</link>
                                                                            <description>
                            <![CDATA[ Samsung's new AI video tracker removed the stress of keeping people in frame, even while filming from a distance. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">7h57rhvdLnPzFtCRjVbG8H</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/coe7VBExjVnSAfiDxs353c-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 02 Aug 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Sanuj Bhatia ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/8p5BvMVA7cnu5AWkxnTjRC-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/coe7VBExjVnSAfiDxs353c-1920-80.jpg">
                                                            <media:credit><![CDATA[Sanuj Bhatia / Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Using the My FanCam feature on Samsung Galaxy Z Fold 8]]></media:description>                                                            <media:text><![CDATA[Using the My FanCam feature on Samsung Galaxy Z Fold 8]]></media:text>
                                <media:title type="plain"><![CDATA[Using the My FanCam feature on Samsung Galaxy Z Fold 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/coe7VBExjVnSAfiDxs353c-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I'm far from a good videographer (which is one of the reasons I've remained a writer-first in this era of Reels, TikToks, and Shorts). But that doesn't mean I don't record videos on my phone. Whenever I'm at a concert, a game, or any kind of event, I still find myself pulling out my phone to capture the moment. </p><p>The problem is that I'm terrible at keeping the camera locked on my subject. Filming a performer from way out in a crowd is quite difficult, especially when you're zoomed in. </p><p>Samsung's new <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">foldable phones</a> come with a new Galaxy AI video tracker feature that is designed to solve exactly that problem. I spent some time trying it on my <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>, and I can confidently say it made filming way easier — even if there's still one thing I'd like Samsung to improve.</p><div data-widget-type="multimodelreview" data-model-name="Samsung Galaxy Z Fold 8,Samsung Galaxy Z Fold 8 Ultra,Samsung Galaxy Z Flip 8"></div><h2 id="how-samsung-s-my-fancam-ai-feature-actually-works">How Samsung's My FanCam AI feature actually works</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="fAx6nqTj5uQitRwaywVdKc" name="z-fold-8-fancam-2" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/fAx6nqTj5uQitRwaywVdKc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>What My FanCam essentially does is take away the stress of trying to keep a moving subject perfectly framed throughout a video. Instead of manually tracking someone while you're recording, Galaxy AI can detect a person in your video after you've finished filming and automatically follow them throughout the clip.</p><p>The end result is a new video that stays focused on that one person, almost as if someone had tracked them with the camera the entire time. </p><p>Using it is fairly straightforward. First, record a video using the Camera app on your Galaxy phone as you normally would. Once you're done, open the video in the <strong>Samsung Gallery app</strong>, tap the <strong>Galaxy AI icon</strong>, and select <strong>My FanCam</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:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="q6wnzsH6AZnGCuG5Wms56c" name="z-fold-8-fancam-5" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/q6wnzsH6AZnGCuG5Wms56c-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Galaxy AI will then scan the video and <strong>detect the different people in the frame</strong>. Once it's finished, you'll see touch targets appear over each detected person. Simply tap the subject you want Galaxy AI to follow. </p><p>Before exporting the video, Samsung also lets you <strong>choose the aspect ratio</strong>. For vertical videos, 9:16 is selected by default, but you can also choose options like 1:1, 3:4, and a few others. </p><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="BKuYJAmt7SFTZcMMhZcz3c" name="z-fold-8-fancam-6" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/BKuYJAmt7SFTZcMMhZcz3c-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Once you've made your selection, tap <strong>Follow</strong>, and Galaxy AI will generate a brand-new video that keeps your chosen subject in frame throughout the clip. You can then preview the result and, if you're happy with it, <strong>Save Copy</strong> to your gallery.</p><h2 id="my-fancam-worked-far-better-than-i-expected-during-my-testing">My FanCam worked far better than I expected during my testing</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/ioP8RU8CD4E" allowfullscreen></iframe></div></div><p>In my testing, the feature worked great and kept track of my subject impressively well. In a way, it reminded me of Apple's Center Stage, except instead of working during live video calls, My FanCam works on pre-recorded videos, and it works on multiple people in the same clip.  </p><p>The AI processing itself is also fairly quick. Samsung says the processing time depends on the length of the clip, but all of the videos I tested were processed within a matter of seconds. </p><p>Another nice touch is that it works on older videos already sitting in your gallery, so you're not limited to footage you shot after you got your new phone. This means you can go back and create FanCam videos from footage you've already captured. </p><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="yLjnZ8oc2DUgEraGBmovKc" name="z-fold-8-fancam-3" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/yLjnZ8oc2DUgEraGBmovKc-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>My biggest complaint right now is that it's exclusive to the Galaxy Z8 series phones. And the cameras, at least on the regular Galaxy Z Fold 8, aren't the sharpest. That means if you're tracking a subject that's far away, the footage can come out looking slightly pixelated once the feature crops and zooms into your subject. </p><p>I think Samsung could take this feature a step further by using Galaxy AI to enhance the final output, especially when the video has been cropped heavily. A little AI sharpening or detail enhancement can take this feature up a notch.</p><p>Even so, I still love the feature in its current form. The fact that Samsung is using AI to automatically track a subject after you've already recorded the video is incredibly useful. I also think it would make even more sense on higher-end Galaxy phones like the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-s26-ultra-vs-galaxy-s25-ultra">Galaxy S26 Ultra</a>, where the better camera hardware would give the AI much more detail to work with. </p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ORMNzW"></div>                            </div>                            <script src="https://kwizly.com/embed/ORMNzW.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/phones/samsung-phones/i-just-realized-the-samsung-galaxy-z-fold-8-ultra-fixes-the-worst-thing-about-fingerprint-scanners">I just realized the Samsung Galaxy Z Fold 8 Ultra fixes the worst thing about fingerprint scanners</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">I just tested the phone everybody thinks is a preview of the iPhone Fold — God, I hope they’re wrong</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Flip 8 review: More expensive, barely different ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve made no secret of the fact that I much prefer flip phones over notebook-style foldables. Part of the reason is that they’re way more compact than the average slab, while offering better utility as a backup vlogging camera over notebook foldables like the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a>.</p><p>But after spending extended time testing generation after generation of flips, I can’t shake the feeling that the Z Flip line has plateaued. With the Galaxy Z Flip 8, Samsung seems content at adding minor polish — all while asking for more of your hard-earned money. Don’t get me wrong: last year’s <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection">Galaxy Z Flip 7</a> emerged as one of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> around, but this year, Samsung hasn’t given the Flip quite the same level of treatment as its Z Fold line.</p><p>What used to feel like the most exciting form factor in tech is starting to suffer from incremental fatigue, which I’ll explain thoroughly in my Galaxy Z Flip 8 review. It’s still a sleek piece of engineering, but when modest tweaks are paired with a price hike, it’s a lot harder to justify the upgrade.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-specifications"><span>Samsung Galaxy Z Flip 8 review: Specifications</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>$1,199 / £1,149 / AU$1,949</p></td></tr><tr><td class="firstcol " ><p><strong>Release date</strong></p></td><td  ><p>August 7</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong>    </p></td><td  ><p>6.9-inch AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong>    </p></td><td  ><p>4.1-inch AMOLED (948 x 1048, 60Hz / 120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong>    </p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Camera</strong>    </p></td><td  ><p>10MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>25W wired / 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>4,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>6.57 x 2.97 x 0.24 inches unfolded (166.9 x 75.4 x 6.1 mm), 3.37 x 2.97 x 0.52 inches folded (85.7 x 75.4 x 13.1mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>6.35 ounces (180 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong>    </p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Pink, Graphite, Cream, Mint (online)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-cheat-sheet"><span>Samsung Galaxy Z Flip 8 review: Cheat sheet</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4166px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="yT39CjfzssnCMqTd9usTV6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 held in hand with FlexWindow on." src="https://cdn.mos.cms.futurecdn.net/yT39CjfzssnCMqTd9usTV6-1920-80.jpg" mos="" align="middle" fullscreen="" width="4166" height="2343" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><ul><li><strong>What is it? </strong>Samsung’s 8th generation flip-style phone, serving as the successor to the previous Galaxy Z Flip 7.</li><li><strong>Who’s it for?</strong> The Galaxy Z Flip 8 is best suited for tech enthusiasts and casual content creators who value a sleek, pocketable clamshell design that gives them creative and more intuitive ways of capturing content.</li><li><strong>What does it cost?</strong> The Samsung Galaxy Z Flip 8 starts at $1,199 for the base model with 256GB of storage — marking a $100 price increase over last year's model. Upgrading to the 512GB option will set you back $1,399.</li><li><strong>What do we like?</strong> The Galaxy Z Flip 8 delivers substantial performance gains thanks to the Snapdragon 8 Elite Gen 5 processor, alongside a noticeably brighter screen that hits a peak of 2,150 nits. It also remains a superb, highly versatile vlogging camera, made even better by the addition of horizon-level stabilization.</li><li><strong>What don't we like?</strong> A $100 price hike makes the Z Flip 8 harder to justify, especially since the overall design, camera hardware, and battery life remain almost the same as before.</li></ul><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-release-date-and-price"><span>Samsung Galaxy Z Flip 8 review: Release date and price</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:5300px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="d4Q3kKfb4LDDnRnCrNLsW6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 held in the hand." src="https://cdn.mos.cms.futurecdn.net/d4Q3kKfb4LDDnRnCrNLsW6-1920-80.jpg" mos="" align="middle" fullscreen="" width="5300" height="2981" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>The Samsung Galaxy Z Flip 8 officially hits shelves on August 7, 2026, with pre-orders live now. However, that tech comes at a higher cost: the Z Flip 8 starts at $1,199 for 256GB of storage.</p><p>That’s a $100 price hike over last year's model, which also saw a $100 increase over the Galaxy Z Flip 6 before it. And if you want the extra storage, Samsung’s asking a whopping $1,399 for the 512GB model. While it’s still cheaper than the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Motorola Razr Ultra 2026</a>’s premium price tag of $1,499 (which comes with 512GB), the bigger problem is how this new price point intrudes on traditional flagship territory.</p><p>You have four color options: Pink, Graphite, Cream, and Mint, which is an online exclusive. The pink shade of my review unit is charming, but the Mint option is definitely the standout of the bunch.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-the-ups"><span>Samsung Galaxy Z Flip 8 review: The Ups</span></h2><h3 class="article-body__section" id="section-substantial-performance-gains"><span>Substantial performance gains</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench 6 (single / multi-core)</strong></p></td><td  ><p><strong>3DMark Wild Life Unlimited (score / fps)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>3,627 / 11,215</p></td><td  ><p>29,723 / 177.9 fps</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra 2026</strong></p></td><td  ><p>2,886 / 8,982</p></td><td  ><p>24,437 / 146.33 fps</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>2,286 / 8,079</p></td><td  ><p>19,144 / 114.64 fps</p></td></tr></tbody></table></div><p>One of the biggest upgrades I’m happy to see is the decision to go back to Qualcomm. Samsung made a surprising switch last year with the Z Flip 7 by using its own Exynos chip, but the return to Qualcomm’s flagship silicon gives the Z Flip 8 its most important hardware upgrade.</p><p>The Snapdragon 8 Elite Gen 5 certainly proves it’s a powerhouse for this flip-style phone, delivering huge performance leaps over the Z Flip 7 — and even its main rival, the Motorola Razr Ultra 2026. In Geekbench 6, the Galaxy Z Flip 8 delivers a single-core score of 3,627 and a multicore score of 11,215. That’s a massive step up over last year's model and noticeably outpaces the Razr Ultra 2026.</p><p>Graphics performance tells a similar story. On 3DMark Wild Life Unlimited, the Z Flip 8 notches an overall score of 29,723 with an average frame rate of 177.9 fps. By comparison, the Z Flip 7 ran at a much slower frame rate (114.6 fps) — while the $1,499 Razr Ultra 2026 reached 24,437 (146.3 fps).</p><h3 class="article-body__section" id="section-brighter-screen"><span>Brighter screen</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4337px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="wWw9JDtres6ZEroPagxRW6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 playing video." src="https://cdn.mos.cms.futurecdn.net/wWw9JDtres6ZEroPagxRW6-1920-80.jpg" mos="" align="middle" fullscreen="" width="4337" height="2440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Despite there being no physical changes to either display, I’m happy to report that the main 6.9-inch AMOLED screen is noticeably brighter, reaching a peak brightness of 2,150 nits. It’s a solid step up over the Z Flip 7’s peak of 1,989 nits, though it still trails the Razr Ultra 2026’s more astounding 2,322-nit reach.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Peak Brightness</strong><br><strong>(Nits)</strong></p></td><td  ><p><strong>Color</strong><br><strong>(DCI-P3)</strong></p></td><td  ><p><strong>Accuracy</strong><br><strong>(Delta-E)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>2,150 nits</p></td><td  ><p>83.4% / 97% (Natural / Vivid)</p></td><td  ><p>0.24 / 0.29 (Natural / Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra 2026</strong></p></td><td  ><p>2,322 nits</p></td><td  ><p>88.3% / 156.5% (Natural / Vivid)</p></td><td  ><p>0.21 / 0.34 (Natural / Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>1,989 nits</p></td><td  ><p>89.8% / 107.4% (Natural / Vivid)</p></td><td  ><p>0.23 / 0.23 (Natural / Vivid)</p></td></tr></tbody></table></div><p>This increase makes it much easier to watch Instagram and TikTok reels outdoors on sunny days. I just wish Samsung had added the same anti-reflective coating found on the Z Fold 8 and Z Fold 8 Ultra, as glare from reflections can still be problematic at certain angles.</p><h3 class="article-body__section" id="section-action-cam-stability-with-horizontal-lock"><span>Action-cam stability with Horizontal Lock</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/dIIuCl9HgwM" allowfullscreen></iframe></div></div><p>One software addition I’m happy to see Samsung borrow from the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a> is the new <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26s-horizontal-lock-might-be-the-best-camera-upgrade-in-years-and-i-put-it-to-the-test">Horizontal Lock</a> option built into Super Steady video mode. No matter how I’m holding the phone — even when jitters are introduced while recording — the video footage stays completely level.</p><p>Because the Z Flip 8’s folding clamshell design naturally lends itself to handheld vlogging, Horizontal Lock is a fantastic pairing for this form factor. While it does result in a slight crop to achieve that gimbal-like stability, the level footage it produces makes handheld clips look surprisingly professional without needing an external stabilizer — and you can see how well it works compared to the Z Flip 7 above.</p><h3 class="article-body__section" id="section-still-a-superb-vlogging-camera"><span>Still a superb vlogging camera</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:5032px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="dUadkRVeyeFgSpGWTHM6U6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 used to vlog." src="https://cdn.mos.cms.futurecdn.net/dUadkRVeyeFgSpGWTHM6U6-1920-80.jpg" mos="" align="middle" fullscreen="" width="5032" height="2830" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Even if the camera hardware remains largely unchanged, the Galaxy Z Flip 8 continues to be one of the best pocketable vlogging setups you can buy. A big reason for that is  its flip-phone form factor, which allows me to prop it up on any flat surface like a built-in tripod or bend it to a 90-degree angle to hold like a classic camcorder.</p><p>What continues to make it such a great tool is the outer FlexWindow paired with the rear cameras. This lets me easily preview the frame while vlogging, while also delivering much better selfie captures than a standard front camera. Plus, compared to larger notebook foldables, it’s still far more intuitive to hold with one hand while keeping an eye on your shot.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-the-downs"><span>Samsung Galaxy Z Flip 8 review: The downs</span></h2><h3 class="article-body__section" id="section-it-s-more-expensive"><span>It’s more expensive</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:5102px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B2o3K3zqms66sMEsuhQ4U6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 review." src="https://cdn.mos.cms.futurecdn.net/B2o3K3zqms66sMEsuhQ4U6-1920-80.jpg" mos="" align="middle" fullscreen="" width="5102" height="2870" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>While the original Galaxy Z Flip from 2020 remains the most expensive model in the series, the Z Flip 8 marks the second consecutive year of a price hike. It’s $100 more at $1,199 for the 256GB base model, while stepping up to 512GB sets you back a steeper $1,399.</p><p>Although it still manages to undercut the even more expensive Motorola Razr Ultra (2026), I don't think the upgrades offer enough value to justify the extra cost. In fact, this higher price point pushes the Z Flip 8 directly into competitive flagship territory. When you're paying this much, minor refinements and a chip upgrade feel a lot harder to rationalize — especially when the overall hardware design, camera specs, and battery performance have largely remained stagnant.</p><h3 class="article-body__section" id="section-design-is-starting-to-look-and-feel-stale"><span>Design is starting to look and feel stale</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/JRtY98ocNNaedDqYopjNY6-1920-80.jpg" alt="Samsung Galaxy Z Flip 8 review." /><figcaption><small role="credit">Tom's Guide / John Velasco</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/MfGWe2sSuepJpmtRutBMY6-1920-80.jpg" alt="Samsung Galaxy Z Flip 8 review." /><figcaption><small role="credit">Tom's Guide / John Velasco</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/cHjRc9VUq37V298GnZ7WU6-1920-80.jpg" alt="Samsung Galaxy Z Flip 8 review." /><figcaption><small role="credit">Tom's Guide / John Velasco</small></figcaption></figure></figure><p>On paper, Samsung manages to make the Z Flip 8 ever so slightly thinner and lighter than its predecessor, but these minor improvements are practically impossible to notice when it’s side-by-side with the Z Flip 7 in real life.</p><p>The fundamental aesthetic remains completely unchanged, as well. From the outer FlexWindow shape, to the flat aluminum sides and hinge mechanism, Samsung is sticking to the exact same visual playbook for another year. While it’s still a sleek, solidly constructed device, the design is undeniably starting to look and feel stale. It deserves the same redesign that allowed the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Z Fold 7</a> to gain attention with its mind-boggling thinness.</p><h3 class="article-body__section" id="section-camera-performance-is-barely-improved"><span>Camera performance is barely improved</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/5onDrXP74YsoPKX5vazGgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Yt2jyVbgZoQBEEAPHxRafM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QuqAkomxsfvBfgLxc99hgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Taking photos with the Galaxy Z Flip 8 feels almost identical to using its predecessor. Across most everyday shooting conditions, I don’t see significant gains in image performance from either its 50MP main camera or its 12MP ultrawide.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/8jFNvUWrRsGzdfJ9cvSTnM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/voxAjzxdgWsXvkHXR2baoM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gD4hisXb9eYHtNFirB9ZrM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Take a look at the daytime shot I captured above of the side of the building in shadow. From the dynamic range performance to the fine details of the stone facade, there’s barely any difference between them.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/heCfmP4RcTc3n6J22o7GgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/BTN5ZSapm3eSgE5xYFCMgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jZPuqwFNhDX5WWQNh9QBhM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Another perfect example is the 10x zoom shot of the tree in the gallery above. The fine details in the trunk and branches are no different between the Z Flip 8 and the Z Flip 7.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/3sH7sebhf5GF7Au2mm35yM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/tUeZ9xTJYxscRY2dHrDAvM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/e6Ga8L5yoJTj5v5xLX7y2N-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Against the Razr Ultra 2026, the Z Flip 8’s 12MP ultrawide doesn’t come close to matching the detail and definition captured by the Razr Ultra. When I zoom into the tree, the Razr's shot exhibits noticeably more definition in the bark and branches.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/UL8HcuGXKj4q6JFezkyoUK-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/q7AnBVdtHpyTdeS2zxKwdM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GTZRj6Pi6VoQvknNv7ADYM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>The sole area where I see significant improvement is low light. I’m referring to near pitch-dark conditions, as opposed to dim scenes with ambient light around. Notice how the Z Flip 8 makes the top level of the house look much brighter compared to the Z Flip 7, all while drawing out more stars in the night sky.</p><h3 class="article-body__section" id="section-marginal-battery-improvement"><span>Marginal battery improvement</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery size (mAh)</strong>    </p></td><td  ><p><strong>Battery life (hrs:mins)</strong>    </p></td><td  ><p><strong>Charging % in 15 minutes</strong></p></td><td  ><p><strong>Charging % in 30 minutes</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>4,300 mAh</p></td><td  ><p>12:50</p></td><td  ><p>35%</p></td><td  ><p>59%</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra (2026)</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>16:20</p></td><td  ><p>42%</p></td><td  ><p>74%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>4,300 mAh</p></td><td  ><p>12:24</p></td><td  ><p>29%</p></td><td  ><p>55%</p></td></tr></tbody></table></div><p>Battery life on the Galaxy Z Flip 8 moves in the right direction, but only by a hair. In our battery drain test, the Z Flip 8 logged an average time of 12 hours and 5 minutes, edging out the Z Flip 7 by under half an hour. What’s strange is that despite having the same 4,300 mAh capacity as before, the Snapdragon 8 Elite Gen 5 doesn't bring as dramatic an endurance boost as what I found with the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a>. At the same time, the Motorola Razr Ultra (2026) blows past both Samsung clamshells with a massive 16:20 battery runtime.</p><p>Unlike the new Folds, the Z Flip 8 doesn’t get faster 45W wired charging. Instead, it remains capped at 25W, and its charging times are barely faster than the Z Flip 7's — with the phone reaching 59% in 30 minutes compared to last year's 55%.</p><h3 class="article-body__section" id="section-not-enough-software-improvements"><span>Not enough software improvements</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:5405px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="xrCY54SFGKoAniBXQAyGV6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 folded halfway." src="https://cdn.mos.cms.futurecdn.net/xrCY54SFGKoAniBXQAyGV6-1920-80.jpg" mos="" align="middle" fullscreen="" width="5405" height="3040" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>On the software front, One UI 9 covers all the basics I want, offering the same strong level of multitasking and productivity Samsung’s custom experience has continually delivered. However, there are only a few new AI tricks, including more multimodal tools, enhanced Flip Shot shooting options, and minor updates to both <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works">Now Brief and Now Nudge</a>.</p><p>The outer FlexWindow, in particular, feels underutilized despite bringing more apps and basic actions to the cover screen. Aside from minor widget updates and basic app support, Samsung hasn't introduced any breakthrough features here. I was hoping for more specialized Galaxy AI tools, but the fact that Samsung didn’t give the Z Flip 8 the same AI-tracking <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-using-the-galaxy-z-fold-8s-myfancam-on-my-dogs-but-i-hit-a-major-wall">My FanCam feature found on the Z Fold 8</a> says a lot about where the software falls short.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-bottom-line"><span>Samsung Galaxy Z Flip 8 review: Bottom line</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4937px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L8LuGeK3a2xS3qb8XqvTX6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 held in the hand with display on." src="https://cdn.mos.cms.futurecdn.net/L8LuGeK3a2xS3qb8XqvTX6-1920-80.jpg" mos="" align="middle" fullscreen="" width="4937" height="2777" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>The Samsung Galaxy Z Flip 8 remains one of the sleekest, most refined clamshell foldables you can buy, but its generational leaps are getting harder to see. On one hand, the return to a Qualcomm silicon with the Snapdragon 8 Elite Gen 5 delivers impressive performance gains, the screen gets bright enough to tackle outdoor glare with ease, and video features like Horizontal Lock make it an even more formidable tool for vlogging. If you're coming from a Z Flip 5 or an older slab phone, these upgrades are enough to warrant buying.</p><p>However, when paired with a $100 price hike that pushes the base model to $1,199, Samsung's baby-step approach feels tough to defend. With the overall design aesthetic, camera specs, charging speeds, and battery endurance remaining unchanged as before — all while competitors like the Motorola Razr Ultra 2026 push the envelope in battery life and image detail — the Z Flip 8 feels less like a step forward and more like a complacent upgrade settled on just getting by.</p><p>It's still a great foldable, but in a market where price tags keep climbing, minor polish is no longer enough to justify the upgrade.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ev1n9X"></div>                            </div>                            <script src="https://kwizly.com/embed/ev1n9X.js" async></script> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-review</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Z Flip 8 delivers top-tier performance and standout vlogging features, but a $100 price hike makes its tough considering all the iterative improvements. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">qW7NnKS6tRkZBg2SiThd5Q</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/5SPZSQE33UbkAxXpUmwkR6-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 01 Aug 2026 04:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/5SPZSQE33UbkAxXpUmwkR6-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / John Velasco]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Flip 8 review.]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Flip 8 review.]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Flip 8 review.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/5SPZSQE33UbkAxXpUmwkR6-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve made no secret of the fact that I much prefer flip phones over notebook-style foldables. Part of the reason is that they’re way more compact than the average slab, while offering better utility as a backup vlogging camera over notebook foldables like the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a>.</p><p>But after spending extended time testing generation after generation of flips, I can’t shake the feeling that the Z Flip line has plateaued. With the Galaxy Z Flip 8, Samsung seems content at adding minor polish — all while asking for more of your hard-earned money. Don’t get me wrong: last year’s <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection">Galaxy Z Flip 7</a> emerged as one of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> around, but this year, Samsung hasn’t given the Flip quite the same level of treatment as its Z Fold line.</p><p>What used to feel like the most exciting form factor in tech is starting to suffer from incremental fatigue, which I’ll explain thoroughly in my Galaxy Z Flip 8 review. It’s still a sleek piece of engineering, but when modest tweaks are paired with a price hike, it’s a lot harder to justify the upgrade.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-specifications"><span>Samsung Galaxy Z Flip 8 review: Specifications</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>$1,199 / £1,149 / AU$1,949</p></td></tr><tr><td class="firstcol " ><p><strong>Release date</strong></p></td><td  ><p>August 7</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong>    </p></td><td  ><p>6.9-inch AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong>    </p></td><td  ><p>4.1-inch AMOLED (948 x 1048, 60Hz / 120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong>    </p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Camera</strong>    </p></td><td  ><p>10MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>25W wired / 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>4,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>6.57 x 2.97 x 0.24 inches unfolded (166.9 x 75.4 x 6.1 mm), 3.37 x 2.97 x 0.52 inches folded (85.7 x 75.4 x 13.1mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>6.35 ounces (180 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong>    </p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Pink, Graphite, Cream, Mint (online)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-cheat-sheet"><span>Samsung Galaxy Z Flip 8 review: Cheat sheet</span></h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4166px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="yT39CjfzssnCMqTd9usTV6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 held in hand with FlexWindow on." src="https://cdn.mos.cms.futurecdn.net/yT39CjfzssnCMqTd9usTV6-1920-80.jpg" mos="" align="middle" fullscreen="" width="4166" height="2343" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><ul><li><strong>What is it? </strong>Samsung’s 8th generation flip-style phone, serving as the successor to the previous Galaxy Z Flip 7.</li><li><strong>Who’s it for?</strong> The Galaxy Z Flip 8 is best suited for tech enthusiasts and casual content creators who value a sleek, pocketable clamshell design that gives them creative and more intuitive ways of capturing content.</li><li><strong>What does it cost?</strong> The Samsung Galaxy Z Flip 8 starts at $1,199 for the base model with 256GB of storage — marking a $100 price increase over last year's model. Upgrading to the 512GB option will set you back $1,399.</li><li><strong>What do we like?</strong> The Galaxy Z Flip 8 delivers substantial performance gains thanks to the Snapdragon 8 Elite Gen 5 processor, alongside a noticeably brighter screen that hits a peak of 2,150 nits. It also remains a superb, highly versatile vlogging camera, made even better by the addition of horizon-level stabilization.</li><li><strong>What don't we like?</strong> A $100 price hike makes the Z Flip 8 harder to justify, especially since the overall design, camera hardware, and battery life remain almost the same as before.</li></ul><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-release-date-and-price"><span>Samsung Galaxy Z Flip 8 review: Release date and price</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:5300px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="d4Q3kKfb4LDDnRnCrNLsW6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 held in the hand." src="https://cdn.mos.cms.futurecdn.net/d4Q3kKfb4LDDnRnCrNLsW6-1920-80.jpg" mos="" align="middle" fullscreen="" width="5300" height="2981" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>The Samsung Galaxy Z Flip 8 officially hits shelves on August 7, 2026, with pre-orders live now. However, that tech comes at a higher cost: the Z Flip 8 starts at $1,199 for 256GB of storage.</p><p>That’s a $100 price hike over last year's model, which also saw a $100 increase over the Galaxy Z Flip 6 before it. And if you want the extra storage, Samsung’s asking a whopping $1,399 for the 512GB model. While it’s still cheaper than the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Motorola Razr Ultra 2026</a>’s premium price tag of $1,499 (which comes with 512GB), the bigger problem is how this new price point intrudes on traditional flagship territory.</p><p>You have four color options: Pink, Graphite, Cream, and Mint, which is an online exclusive. The pink shade of my review unit is charming, but the Mint option is definitely the standout of the bunch.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-the-ups"><span>Samsung Galaxy Z Flip 8 review: The Ups</span></h2><h3 class="article-body__section" id="section-substantial-performance-gains"><span>Substantial performance gains</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench 6 (single / multi-core)</strong></p></td><td  ><p><strong>3DMark Wild Life Unlimited (score / fps)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>3,627 / 11,215</p></td><td  ><p>29,723 / 177.9 fps</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra 2026</strong></p></td><td  ><p>2,886 / 8,982</p></td><td  ><p>24,437 / 146.33 fps</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>2,286 / 8,079</p></td><td  ><p>19,144 / 114.64 fps</p></td></tr></tbody></table></div><p>One of the biggest upgrades I’m happy to see is the decision to go back to Qualcomm. Samsung made a surprising switch last year with the Z Flip 7 by using its own Exynos chip, but the return to Qualcomm’s flagship silicon gives the Z Flip 8 its most important hardware upgrade.</p><p>The Snapdragon 8 Elite Gen 5 certainly proves it’s a powerhouse for this flip-style phone, delivering huge performance leaps over the Z Flip 7 — and even its main rival, the Motorola Razr Ultra 2026. In Geekbench 6, the Galaxy Z Flip 8 delivers a single-core score of 3,627 and a multicore score of 11,215. That’s a massive step up over last year's model and noticeably outpaces the Razr Ultra 2026.</p><p>Graphics performance tells a similar story. On 3DMark Wild Life Unlimited, the Z Flip 8 notches an overall score of 29,723 with an average frame rate of 177.9 fps. By comparison, the Z Flip 7 ran at a much slower frame rate (114.6 fps) — while the $1,499 Razr Ultra 2026 reached 24,437 (146.3 fps).</p><h3 class="article-body__section" id="section-brighter-screen"><span>Brighter screen</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4337px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="wWw9JDtres6ZEroPagxRW6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 playing video." src="https://cdn.mos.cms.futurecdn.net/wWw9JDtres6ZEroPagxRW6-1920-80.jpg" mos="" align="middle" fullscreen="" width="4337" height="2440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Despite there being no physical changes to either display, I’m happy to report that the main 6.9-inch AMOLED screen is noticeably brighter, reaching a peak brightness of 2,150 nits. It’s a solid step up over the Z Flip 7’s peak of 1,989 nits, though it still trails the Razr Ultra 2026’s more astounding 2,322-nit reach.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Peak Brightness</strong><br><strong>(Nits)</strong></p></td><td  ><p><strong>Color</strong><br><strong>(DCI-P3)</strong></p></td><td  ><p><strong>Accuracy</strong><br><strong>(Delta-E)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>2,150 nits</p></td><td  ><p>83.4% / 97% (Natural / Vivid)</p></td><td  ><p>0.24 / 0.29 (Natural / Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra 2026</strong></p></td><td  ><p>2,322 nits</p></td><td  ><p>88.3% / 156.5% (Natural / Vivid)</p></td><td  ><p>0.21 / 0.34 (Natural / Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>1,989 nits</p></td><td  ><p>89.8% / 107.4% (Natural / Vivid)</p></td><td  ><p>0.23 / 0.23 (Natural / Vivid)</p></td></tr></tbody></table></div><p>This increase makes it much easier to watch Instagram and TikTok reels outdoors on sunny days. I just wish Samsung had added the same anti-reflective coating found on the Z Fold 8 and Z Fold 8 Ultra, as glare from reflections can still be problematic at certain angles.</p><h3 class="article-body__section" id="section-action-cam-stability-with-horizontal-lock"><span>Action-cam stability with Horizontal Lock</span></h3><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/dIIuCl9HgwM" allowfullscreen></iframe></div></div><p>One software addition I’m happy to see Samsung borrow from the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-review">Galaxy S26</a> is the new <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26s-horizontal-lock-might-be-the-best-camera-upgrade-in-years-and-i-put-it-to-the-test">Horizontal Lock</a> option built into Super Steady video mode. No matter how I’m holding the phone — even when jitters are introduced while recording — the video footage stays completely level.</p><p>Because the Z Flip 8’s folding clamshell design naturally lends itself to handheld vlogging, Horizontal Lock is a fantastic pairing for this form factor. While it does result in a slight crop to achieve that gimbal-like stability, the level footage it produces makes handheld clips look surprisingly professional without needing an external stabilizer — and you can see how well it works compared to the Z Flip 7 above.</p><h3 class="article-body__section" id="section-still-a-superb-vlogging-camera"><span>Still a superb vlogging camera</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:5032px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="dUadkRVeyeFgSpGWTHM6U6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 used to vlog." src="https://cdn.mos.cms.futurecdn.net/dUadkRVeyeFgSpGWTHM6U6-1920-80.jpg" mos="" align="middle" fullscreen="" width="5032" height="2830" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>Even if the camera hardware remains largely unchanged, the Galaxy Z Flip 8 continues to be one of the best pocketable vlogging setups you can buy. A big reason for that is  its flip-phone form factor, which allows me to prop it up on any flat surface like a built-in tripod or bend it to a 90-degree angle to hold like a classic camcorder.</p><p>What continues to make it such a great tool is the outer FlexWindow paired with the rear cameras. This lets me easily preview the frame while vlogging, while also delivering much better selfie captures than a standard front camera. Plus, compared to larger notebook foldables, it’s still far more intuitive to hold with one hand while keeping an eye on your shot.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-the-downs"><span>Samsung Galaxy Z Flip 8 review: The downs</span></h2><h3 class="article-body__section" id="section-it-s-more-expensive"><span>It’s more expensive</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:5102px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="B2o3K3zqms66sMEsuhQ4U6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 review." src="https://cdn.mos.cms.futurecdn.net/B2o3K3zqms66sMEsuhQ4U6-1920-80.jpg" mos="" align="middle" fullscreen="" width="5102" height="2870" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>While the original Galaxy Z Flip from 2020 remains the most expensive model in the series, the Z Flip 8 marks the second consecutive year of a price hike. It’s $100 more at $1,199 for the 256GB base model, while stepping up to 512GB sets you back a steeper $1,399.</p><p>Although it still manages to undercut the even more expensive Motorola Razr Ultra (2026), I don't think the upgrades offer enough value to justify the extra cost. In fact, this higher price point pushes the Z Flip 8 directly into competitive flagship territory. When you're paying this much, minor refinements and a chip upgrade feel a lot harder to rationalize — especially when the overall hardware design, camera specs, and battery performance have largely remained stagnant.</p><h3 class="article-body__section" id="section-design-is-starting-to-look-and-feel-stale"><span>Design is starting to look and feel stale</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/JRtY98ocNNaedDqYopjNY6-1920-80.jpg" alt="Samsung Galaxy Z Flip 8 review." /><figcaption><small role="credit">Tom's Guide / John Velasco</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/MfGWe2sSuepJpmtRutBMY6-1920-80.jpg" alt="Samsung Galaxy Z Flip 8 review." /><figcaption><small role="credit">Tom's Guide / John Velasco</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/cHjRc9VUq37V298GnZ7WU6-1920-80.jpg" alt="Samsung Galaxy Z Flip 8 review." /><figcaption><small role="credit">Tom's Guide / John Velasco</small></figcaption></figure></figure><p>On paper, Samsung manages to make the Z Flip 8 ever so slightly thinner and lighter than its predecessor, but these minor improvements are practically impossible to notice when it’s side-by-side with the Z Flip 7 in real life.</p><p>The fundamental aesthetic remains completely unchanged, as well. From the outer FlexWindow shape, to the flat aluminum sides and hinge mechanism, Samsung is sticking to the exact same visual playbook for another year. While it’s still a sleek, solidly constructed device, the design is undeniably starting to look and feel stale. It deserves the same redesign that allowed the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Z Fold 7</a> to gain attention with its mind-boggling thinness.</p><h3 class="article-body__section" id="section-camera-performance-is-barely-improved"><span>Camera performance is barely improved</span></h3><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/5onDrXP74YsoPKX5vazGgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Yt2jyVbgZoQBEEAPHxRafM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QuqAkomxsfvBfgLxc99hgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Taking photos with the Galaxy Z Flip 8 feels almost identical to using its predecessor. Across most everyday shooting conditions, I don’t see significant gains in image performance from either its 50MP main camera or its 12MP ultrawide.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/8jFNvUWrRsGzdfJ9cvSTnM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/voxAjzxdgWsXvkHXR2baoM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/gD4hisXb9eYHtNFirB9ZrM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Take a look at the daytime shot I captured above of the side of the building in shadow. From the dynamic range performance to the fine details of the stone facade, there’s barely any difference between them.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/heCfmP4RcTc3n6J22o7GgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/BTN5ZSapm3eSgE5xYFCMgM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/jZPuqwFNhDX5WWQNh9QBhM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Another perfect example is the 10x zoom shot of the tree in the gallery above. The fine details in the trunk and branches are no different between the Z Flip 8 and the Z Flip 7.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/3sH7sebhf5GF7Au2mm35yM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/tUeZ9xTJYxscRY2dHrDAvM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/e6Ga8L5yoJTj5v5xLX7y2N-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Against the Razr Ultra 2026, the Z Flip 8’s 12MP ultrawide doesn’t come close to matching the detail and definition captured by the Razr Ultra. When I zoom into the tree, the Razr's shot exhibits noticeably more definition in the bark and branches.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/UL8HcuGXKj4q6JFezkyoUK-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/q7AnBVdtHpyTdeS2zxKwdM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Z Flip 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/GTZRj6Pi6VoQvknNv7ADYM-1920-80.jpg" alt="Galaxy Z Flip photo comparisons" /><figcaption>Razr Ultra 2026<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>The sole area where I see significant improvement is low light. I’m referring to near pitch-dark conditions, as opposed to dim scenes with ambient light around. Notice how the Z Flip 8 makes the top level of the house look much brighter compared to the Z Flip 7, all while drawing out more stars in the night sky.</p><h3 class="article-body__section" id="section-marginal-battery-improvement"><span>Marginal battery improvement</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery size (mAh)</strong>    </p></td><td  ><p><strong>Battery life (hrs:mins)</strong>    </p></td><td  ><p><strong>Charging % in 15 minutes</strong></p></td><td  ><p><strong>Charging % in 30 minutes</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>4,300 mAh</p></td><td  ><p>12:50</p></td><td  ><p>35%</p></td><td  ><p>59%</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra (2026)</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>16:20</p></td><td  ><p>42%</p></td><td  ><p>74%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>4,300 mAh</p></td><td  ><p>12:24</p></td><td  ><p>29%</p></td><td  ><p>55%</p></td></tr></tbody></table></div><p>Battery life on the Galaxy Z Flip 8 moves in the right direction, but only by a hair. In our battery drain test, the Z Flip 8 logged an average time of 12 hours and 5 minutes, edging out the Z Flip 7 by under half an hour. What’s strange is that despite having the same 4,300 mAh capacity as before, the Snapdragon 8 Elite Gen 5 doesn't bring as dramatic an endurance boost as what I found with the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a>. At the same time, the Motorola Razr Ultra (2026) blows past both Samsung clamshells with a massive 16:20 battery runtime.</p><p>Unlike the new Folds, the Z Flip 8 doesn’t get faster 45W wired charging. Instead, it remains capped at 25W, and its charging times are barely faster than the Z Flip 7's — with the phone reaching 59% in 30 minutes compared to last year's 55%.</p><h3 class="article-body__section" id="section-not-enough-software-improvements"><span>Not enough software improvements</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:5405px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="xrCY54SFGKoAniBXQAyGV6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 folded halfway." src="https://cdn.mos.cms.futurecdn.net/xrCY54SFGKoAniBXQAyGV6-1920-80.jpg" mos="" align="middle" fullscreen="" width="5405" height="3040" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>On the software front, One UI 9 covers all the basics I want, offering the same strong level of multitasking and productivity Samsung’s custom experience has continually delivered. However, there are only a few new AI tricks, including more multimodal tools, enhanced Flip Shot shooting options, and minor updates to both <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works">Now Brief and Now Nudge</a>.</p><p>The outer FlexWindow, in particular, feels underutilized despite bringing more apps and basic actions to the cover screen. Aside from minor widget updates and basic app support, Samsung hasn't introduced any breakthrough features here. I was hoping for more specialized Galaxy AI tools, but the fact that Samsung didn’t give the Z Flip 8 the same AI-tracking <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-using-the-galaxy-z-fold-8s-myfancam-on-my-dogs-but-i-hit-a-major-wall">My FanCam feature found on the Z Fold 8</a> says a lot about where the software falls short.</p><h3 class="article-body__section" id="section-samsung-galaxy-z-flip-8-review-bottom-line"><span>Samsung Galaxy Z Flip 8 review: Bottom line</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4937px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="L8LuGeK3a2xS3qb8XqvTX6" name="Samsung Galaxy Z Flip 8 review" alt="Samsung Galaxy Z Flip 8 held in the hand with display on." src="https://cdn.mos.cms.futurecdn.net/L8LuGeK3a2xS3qb8XqvTX6-1920-80.jpg" mos="" align="middle" fullscreen="" width="4937" height="2777" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide / John Velasco)</span></figcaption></figure><p>The Samsung Galaxy Z Flip 8 remains one of the sleekest, most refined clamshell foldables you can buy, but its generational leaps are getting harder to see. On one hand, the return to a Qualcomm silicon with the Snapdragon 8 Elite Gen 5 delivers impressive performance gains, the screen gets bright enough to tackle outdoor glare with ease, and video features like Horizontal Lock make it an even more formidable tool for vlogging. If you're coming from a Z Flip 5 or an older slab phone, these upgrades are enough to warrant buying.</p><p>However, when paired with a $100 price hike that pushes the base model to $1,199, Samsung's baby-step approach feels tough to defend. With the overall design aesthetic, camera specs, charging speeds, and battery endurance remaining unchanged as before — all while competitors like the Motorola Razr Ultra 2026 push the envelope in battery life and image detail — the Z Flip 8 feels less like a step forward and more like a complacent upgrade settled on just getting by.</p><p>It's still a great foldable, but in a market where price tags keep climbing, minor polish is no longer enough to justify the upgrade.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ev1n9X"></div>                            </div>                            <script src="https://kwizly.com/embed/ev1n9X.js" async></script>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Don't pay full price for your Galaxy Z Fold 8: this preorder deal knocks up to $1,200 off ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra are slated to release on August 8. Priced at $1,899 and $2,099, respectively, these new phones are among the priciest foldables I've seen. But they don't need to be. There are plenty of <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Galaxy Z Fold 8 preorder deals</a> you can get right now and Samsung has some of the best. </p><p>For example, right now you can get <a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow">up to $1,200 off the Galaxy Z Fold 8 at Samsung</a> with trade-in. Don't have a phone to trade? Samsung will offer you a $200 Samsung credit. We gave the Fold 8 an Editor's Choice award and said it feels like the future of foldables. Below I've rounded up all of Samsung's Galaxy Z preorders.</p><p>Looking for more personal recommendations? Make sure to check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> homepage and our <a href="https://www.tomsguide.com/news/ultimate-back-to-school-guide">back to school deals</a> guide. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><a href="https://www.samsung.com/us/smartphones/all-smartphones/" target="_blank" rel="nofollow"><strong>shop all Galaxy deals at Samsung</strong></a></li><li><strong>Galaxy Z Fold 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in</strong></a></li><li><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in</strong></a></li></ul><h3 class="article-body__section" id="section-best-galaxy-z-deals"><span>Best Galaxy Z deals</span></h3><div class="product"><a data-dimension112="bbf62894-8d1a-11f1-964c-2b8b30be3e70" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="bbf62894-8d1a-11f1-964c-2b8b30be3e70" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8 review</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but you get a greatly reduced crease, brighter main screen, and lighter design.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="bbf62894-8d1a-11f1-964c-2b8b30be3e70" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="bbf6290c-8d1a-11f1-8413-1f610fa19001" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="bbf6290c-8d1a-11f1-8413-1f610fa19001" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 Ultra preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 8-inch AMOLED (2504 x 2256) 120Hz main display, 6.5-inch AMOLED (1080 x 2520) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 200MP main wide-angle lens, 50MP ultra-wide lens, and 10MP telephoto lens (3x optical). Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="bbf6290c-8d1a-11f1-8413-1f610fa19001" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/dont-pay-full-price-for-your-galaxy-z-fold-8-this-preorder-deal-knocks-up-to-usd1-200-off</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra are two of the most expensive foldables on the market. Here's how you can save up to $1,200 with early preorders. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CvmRFGxbjTsdpfZKWKvQu6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/GtEqu8qMu5TFusi2Q5xh2K-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 31 Jul 2026 20:06:23 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5-320-70.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more. He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac. &lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/GtEqu8qMu5TFusi2Q5xh2K-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 held in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 held in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 held in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/GtEqu8qMu5TFusi2Q5xh2K-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra are slated to release on August 8. Priced at $1,899 and $2,099, respectively, these new phones are among the priciest foldables I've seen. But they don't need to be. There are plenty of <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Galaxy Z Fold 8 preorder deals</a> you can get right now and Samsung has some of the best. </p><p>For example, right now you can get <a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow">up to $1,200 off the Galaxy Z Fold 8 at Samsung</a> with trade-in. Don't have a phone to trade? Samsung will offer you a $200 Samsung credit. We gave the Fold 8 an Editor's Choice award and said it feels like the future of foldables. Below I've rounded up all of Samsung's Galaxy Z preorders.</p><p>Looking for more personal recommendations? Make sure to check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> homepage and our <a href="https://www.tomsguide.com/news/ultimate-back-to-school-guide">back to school deals</a> guide. </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><a href="https://www.samsung.com/us/smartphones/all-smartphones/" target="_blank" rel="nofollow"><strong>shop all Galaxy deals at Samsung</strong></a></li><li><strong>Galaxy Z Fold 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in</strong></a></li><li><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow"><strong>up to $1,200 off w/ trade-in</strong></a></li></ul><h3 class="article-body__section" id="section-best-galaxy-z-deals"><span>Best Galaxy Z deals</span></h3><div class="product"><a data-dimension112="bbf62894-8d1a-11f1-964c-2b8b30be3e70" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="bbf62894-8d1a-11f1-964c-2b8b30be3e70" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8 review</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but you get a greatly reduced crease, brighter main screen, and lighter design.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="bbf62894-8d1a-11f1-964c-2b8b30be3e70" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="bbf6290c-8d1a-11f1-8413-1f610fa19001" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="bbf6290c-8d1a-11f1-8413-1f610fa19001" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 Ultra preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 8-inch AMOLED (2504 x 2256) 120Hz main display, 6.5-inch AMOLED (1080 x 2520) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 200MP main wide-angle lens, 50MP ultra-wide lens, and 10MP telephoto lens (3x optical). Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra review</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8-ultra/buy/galaxy-z-fold8-ultra-256gb-unlocked-sku-sm-f976uzvaxaa/" target="_blank" rel="nofollow" data-dimension112="bbf6290c-8d1a-11f1-8413-1f610fa19001" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ ‘We don’t want to overwhelm the consumer with AI’: why Samsung is taking a different approach with Galaxy Z Fold 8 launch ]]></title>
                                                                                                <dc:content><![CDATA[ <p>In case you hadn’t noticed, AI is having a bit of a backlash moment. More and more people are opposed to data center construction where they live, for example, and a lot of consumers (especially Gen Z) are questioning the need for generative AI overall.</p><p>Samsung seems to be tuned in to this sentiment with the launch of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>. Instead of hitting people over the head with ‘Galaxy AI,’ the company is focusing on a handful of features that it believes have real-world benefits.</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/azQSspXAvxY" allowfullscreen></iframe></div></div><p>“We don’t want to overwhelm the consumer with AI,” Samsung EVP Jay Kim told me. “A lot of industry focus on AI is sort of as itself as a technology, but I think it’s shifting from technology to benefits. We’re looking at how you make this meaningful, how do you make this more easy to access?”</p><h2 id="subtler-ai">Subtler AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aU3ngqVpjk6ewWQungWboA" name="Fold 8 Now Nudge" alt="Galaxy Z Fold 8 Now Nudge AI feature" src="https://cdn.mos.cms.futurecdn.net/aU3ngqVpjk6ewWQungWboA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One example is <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works">Now Nudge</a>. Say you get an incoming text that references an upcoming appointment with the date. The Z Fold 8 and Z Fold 8 Ultra are smart enough to present a little Calendar button. When you tap that, the Calendar app will automatically open in Split View on the right side of the display.</p><p>“You're looking at the screen, and then it understands where you're looking at, and then it actually provides the next action, it suggests your action,” Kim said. “Before you have to go through extra steps to make that work, but now it's instant. We’re just trying to help consumers get things done in a more easy way.”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BKuYJAmt7SFTZcMMhZcz3c" name="z-fold-8-fancam-6" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/BKuYJAmt7SFTZcMMhZcz3c-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Another example of AI that’s less in your face is My FanCam. When editing a video on the Galaxy Z Fold 8 and Fold 8 Ultra, you can select a subject and the phone will recut the video so that it “follows” only that person. You can even choose your preferred aspect ratio. And it works seamlessly based on my testing.</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/6m04UbLVC9E" allowfullscreen></iframe></div></div><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aFwm3S3JDE0" allowfullscreen></iframe></div></div><p>To access this feature you have to select the AI icon first. One might argue it’s too subtle and not easily discoverable enough.</p><p>“We’re looking at consumers and we're looking at how they behave and how they use a device,” said Kim. “We just want to make sure that they get what they need at the right time, without sort of thinking too much about whether it's coming from AI.”</p><h2 id="automating-the-everyday">Automating the everyday</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xk5KeA75WpyRNUfgTjXLuY" name="Fold 8 multitasking" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/xk5KeA75WpyRNUfgTjXLuY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 series is even letting AI do stuff for you in the background with Gemini Intelligence task automation, which now supports 40 apps. This includes shopping, restaurant reservations, travel booking and event tickets.</p><p>For example, you can tell your Fold 8 to help book you a vacation and give it some parameters, and it will start working with Expedia to make it happen. You can jump in at any time, and Gemini Intelligence won’t make any purchases without your approval.</p><p>“When we put automation in place it has to work right,” Kim said. “The consumer needs to understand how it works. So we’re taking it one step at a time and we’re not rushing, because the experience is more important.”</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">Galaxy Z Fold 8 interview: Samsung on silicon carbon batteries, the (possible) S Pen return and the iPhone Ultra threat</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/9-best-samsung-galaxy-z-fold-8-and-fold-8-ultra-cases-to-protect-your-new-smartphone-from-usd19">9 best Samsung Galaxy Z Fold 8 and Fold 8 Ultra cases to protect your new smartphone — from $19</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off">Samsung Galaxy Z Fold 8, Fold 8 Ultra, and Flip 8 battery life tested — silicon carbon pays off</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/we-dont-want-to-overwhelm-the-consumer-with-ai-why-samsung-is-taking-a-different-approach-with-galaxy-z-fold-8-launch</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Z Fold 8 is less in your face with AI features. I spoke with Samsung executive vice president Jay Kim about why it’s taking a subtler approach with AI this time around. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">3Tt3MLxucb7M53j4JppBC4</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/CdhsuAu4DLMo5biUye6HoG-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 31 Jul 2026 07:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[AI]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/CdhsuAu4DLMo5biUye6HoG-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung/Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung executive vice president Jay Kim on the left and a Samsung Galaxy Z Fold 8 in hand on the right]]></media:description>                                                            <media:text><![CDATA[Samsung executive vice president Jay Kim on the left and a Samsung Galaxy Z Fold 8 in hand on the right]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung executive vice president Jay Kim on the left and a Samsung Galaxy Z Fold 8 in hand on the right]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/CdhsuAu4DLMo5biUye6HoG-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>In case you hadn’t noticed, AI is having a bit of a backlash moment. More and more people are opposed to data center construction where they live, for example, and a lot of consumers (especially Gen Z) are questioning the need for generative AI overall.</p><p>Samsung seems to be tuned in to this sentiment with the launch of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review">Galaxy Z Fold 8 Ultra</a>. Instead of hitting people over the head with ‘Galaxy AI,’ the company is focusing on a handful of features that it believes have real-world benefits.</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/azQSspXAvxY" allowfullscreen></iframe></div></div><p>“We don’t want to overwhelm the consumer with AI,” Samsung EVP Jay Kim told me. “A lot of industry focus on AI is sort of as itself as a technology, but I think it’s shifting from technology to benefits. We’re looking at how you make this meaningful, how do you make this more easy to access?”</p><h2 id="subtler-ai">Subtler AI</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aU3ngqVpjk6ewWQungWboA" name="Fold 8 Now Nudge" alt="Galaxy Z Fold 8 Now Nudge AI feature" src="https://cdn.mos.cms.futurecdn.net/aU3ngqVpjk6ewWQungWboA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One example is <a href="https://www.tomsguide.com/phones/samsung-phones/how-to-turn-on-galaxy-s26s-now-nudge-and-how-it-works">Now Nudge</a>. Say you get an incoming text that references an upcoming appointment with the date. The Z Fold 8 and Z Fold 8 Ultra are smart enough to present a little Calendar button. When you tap that, the Calendar app will automatically open in Split View on the right side of the display.</p><p>“You're looking at the screen, and then it understands where you're looking at, and then it actually provides the next action, it suggests your action,” Kim said. “Before you have to go through extra steps to make that work, but now it's instant. We’re just trying to help consumers get things done in a more easy way.”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2560px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="BKuYJAmt7SFTZcMMhZcz3c" name="z-fold-8-fancam-6" alt="Using the My FanCam feature on Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/BKuYJAmt7SFTZcMMhZcz3c-1920-80.jpg" mos="" align="middle" fullscreen="" width="2560" height="1440" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Sanuj Bhatia / Tom's Guide)</span></figcaption></figure><p>Another example of AI that’s less in your face is My FanCam. When editing a video on the Galaxy Z Fold 8 and Fold 8 Ultra, you can select a subject and the phone will recut the video so that it “follows” only that person. You can even choose your preferred aspect ratio. And it works seamlessly based on my testing.</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/6m04UbLVC9E" allowfullscreen></iframe></div></div><div class="youtube-video" data-nosnippet ><div class="video-aspect-box"><iframe data-lazy-priority="low" data-lazy-src="https://www.youtube-nocookie.com/embed/aFwm3S3JDE0" allowfullscreen></iframe></div></div><p>To access this feature you have to select the AI icon first. One might argue it’s too subtle and not easily discoverable enough.</p><p>“We’re looking at consumers and we're looking at how they behave and how they use a device,” said Kim. “We just want to make sure that they get what they need at the right time, without sort of thinking too much about whether it's coming from AI.”</p><h2 id="automating-the-everyday">Automating the everyday</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xk5KeA75WpyRNUfgTjXLuY" name="Fold 8 multitasking" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/xk5KeA75WpyRNUfgTjXLuY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 series is even letting AI do stuff for you in the background with Gemini Intelligence task automation, which now supports 40 apps. This includes shopping, restaurant reservations, travel booking and event tickets.</p><p>For example, you can tell your Fold 8 to help book you a vacation and give it some parameters, and it will start working with Expedia to make it happen. You can jump in at any time, and Gemini Intelligence won’t make any purchases without your approval.</p><p>“When we put automation in place it has to work right,” Kim said. “The consumer needs to understand how it works. So we’re taking it one step at a time and we’re not rushing, because the experience is more important.”</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">Galaxy Z Fold 8 interview: Samsung on silicon carbon batteries, the (possible) S Pen return and the iPhone Ultra threat</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/9-best-samsung-galaxy-z-fold-8-and-fold-8-ultra-cases-to-protect-your-new-smartphone-from-usd19">9 best Samsung Galaxy Z Fold 8 and Fold 8 Ultra cases to protect your new smartphone — from $19</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off">Samsung Galaxy Z Fold 8, Fold 8 Ultra, and Flip 8 battery life tested — silicon carbon pays off</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Fold 8 Ultra review: A major leap forward ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung Galaxy Z Fold 8 Ultra is the start of something new, in a way that's a lot closer to how Samsung's non-folding phones have been operating for the past several years. Foldables are going Ultra, and it feels like Samsung is trying to push the idea that this isn't just a simple rebranding — there are some real changes behind the scenes.</p><p>There's more to new phones than adding flashier specs and bigger batteries, though, which is why I've been testing the Galaxy Z Fold 8 Ultra to see if it's really worthy of referring to itself as such. The good news is that this isn't just a boring incremental update with some new box art. The Z Fold 8 Ultra may share the same look as its predecessor, the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a>, but it actually feels like one of the more noteworthy upgrades to come out of Samsung for quite a few years.</p><p>Read on for our full Samsung Galaxy Z Fold 8 Ultra review.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-cheat-sheet"><span>Samsung Galaxy Z fold 8 Ultra review: Cheat Sheet</span></h2><ul><li><strong>What is it?</strong> The latest and best foldable to come out of Samsung, serving as a sequel to the Galaxy Z Fold 7 despite the addition of the Ultra branding.</li><li><strong>Who is it for?</strong> People who want the absolute best foldable experience possible, with the largest screen, and have the money to pay for it</li><li><strong>What does it cost? </strong>Prices start at $2,099 / £1,899 / AU$2,999 for a model with 256GB of storage and 12GB RAM. Release date is scheduled for August 7.</li><li><strong>What do we like? </strong>The Galaxy Z Fold 8 Ultra offers an incredible screen, that's brighter and less reflective than before, as well as powerful performance, good cameras, and the best battery life of any Galaxy foldable so far.</li><li><strong>What don't we like? </strong>Weak performance from the telephoto lens, the lack of S Pen stylus support, minimal design upgrades and the fact the price is $100 more than last year — marking the third consecutive Z Fold price hike.</li></ul><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-specifications"><span>Samsung Galaxy Z Fold 8 Ultra review: Specifications</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>From $2,099 / £1,899 / AU$2,999</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong>    </p></td><td  ><p>8 inches AMOLED (2184 x 1968, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong>    </p></td><td  ><p>6.5 inches AMOLED (2520 x 1080, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB (16GB for 1TB)</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB/512GB/1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong>    </p></td><td  ><p>200MP wide, 50MP ultra-wide, 10MP telephoto (3x optical)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover camera</strong>    </p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Main display camera</strong>    </p></td><td  ><p>10MP </p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>45W wired / 20W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.16 inches) unfolded</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>215 grams (7.5 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong>    </p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Violet shadow, Cream, Graphite, Violet Green (online exclusive)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-the-ups"><span>Samsung Galaxy Z Fold 8 Ultra review:  The Ups</span></h2><h2 id="major-battery-life-gains">Major battery life gains</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2513px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="XqXqR7veof9Xv39t6m33WE" name="Galaxy Z Fold 8 Ultra review-17" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/XqXqR7veof9Xv39t6m33WE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2513" height="1414" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Samsung's foldables haven't always been known for their strong battery life, even as the flagship Galaxy S series pushes up our best phone battery life page. This year sees that change, and it's no doubt thanks to the larger 5,000 mAh battery pack. Not only is that the same size as the battery in the Galaxy S26 Ultra, it's also 600 mAh larger than the one in the Z Fold 7.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Hours : Minutes</strong></p></td><td  ><p><strong>Charging % in 30 minutes</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>14:33</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>12:19</p></td><td  ><p>70%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy 7 Fold 7</strong></p></td><td  ><p>10:44</p></td><td  ><p>54%</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>14:44</p></td><td  ><p>73%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>16:10</p></td><td  ><p>77%</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>17:54</p></td><td  ><p>64%</p></td></tr></tbody></table></div><p>During our custom battery life test, which involves web surfing over a 5G connection and setting the display to 150 nits of brightness, we recorded a battery life of 14 hours and 33 minutes. That's almost four hours more than the Z Fold 7 and more than two hours longer than the passport-shaped Galaxy Z Fold 8 and its 4,800 mAh battery. </p><p>However, it's not quite enough to match the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>, which scored 16 hours and 10 minutes, or the  14 hours and 44 minute battery life we recorded on the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-battery-life-test-results-are-in-and-it-sets-a-new-record-for-notebook-style-foldables">Motorola Razr Fold</a>.</p><p>During my time with the Z Fold Ultra, the battery seemed fairly strong, and I regularly went to sleep without plugging the foldable in to recharge overnight because I knew it would still be alive and kicking the very next morning. The faster 45W charging meant that I could plug the Ultra in while getting ready, comfortable in the knowledge that it would recharge enough to get me through the day.</p><p>Samsung promised that the Z Fold 8 Ultra could reclaim 67% battery after half an hour of charging, but we found the battery actually hit 76%. We're used to seeing recharge percentages differ from official figures by a percent or three, but it's rare that we see it go this far in the right direction.</p><p>On top of this, if you're more inclined to wireless charging, the upgraded Qi2.2 wireless charging protocol offers up to 20W speeds. That's up from 15W, but it does lag behind the likes of Apple and Google, who have offered 25W Qi2.2 speeds.</p><h2 id="major-league-performance">Major league performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3389px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="NNgZruxjbXt4XgkfTXQG6F" name="Galaxy Z Fold 8 Ultra review-11" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/NNgZruxjbXt4XgkfTXQG6F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3389" height="1906" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This year marks the first time that Samsung has used the custom "for Galaxy" chipset in a foldable phone. Normally Z Fold models are left with the standard flagship Snapdragon chip which, while no slouch, isn't as powerful as the Galaxy S-exclusive variant. This means that this year's benchmarking scores are a little higher than we initially anticipated.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench (Single/Multicore)</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold Ultra</strong></p></td><td  ><p>3,733/11,457</p></td><td  ><p>49.24/12,950</p></td><td  ><p>71715</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>3,659/11,020</p></td><td  ><p>47.35/12,454</p></td><td  ><p>72242</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>2.711/9,134</p></td><td  ><p>35.12/9,413</p></td><td  ><p>59663</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>3,052/9,735</p></td><td  ><p>41.21/10,812</p></td><td  ><p>61299</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>3,785 / 11,563</p></td><td  ><p>49.37 / 12,984</p></td><td  ><p>83047 (TensorFlow Lite QNN)</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>3,871 / 9,968</p></td><td  ><p>46.6 / 12,260</p></td><td  ><p>48549 (Quantitized Score ML/Neural Engine)</p></td></tr></tbody></table></div><p>Geekbench 6 benchmarking saw the Z Fold 8 Ultra's Snapdragon 8 Elite Gen 5 for Galaxy chip hit a score of 3,733 on single core testing and 11,457 on multi core tests . That's up from 3,052 and 9,735 on the Z Fold 7's Snapdragon 8 Elite chip. </p><p>Graphics performance, scored using the 3DMark Solar Bay Unlimited test, also rose by a noticeable amount with a score of 12,950 and average frame rate of 49.24 fps. The Z Fold 7 only scores 10,812 and 41.21 fps. Meanwhile Geekbench AI scored 71,715 to the Z Fold 7's 61,299. The Ultra's figures also thrashed the Motorola Razr Fold, though they do trail the Galaxy S26 Ultra by a small amount</p><p>The performance improvements were noticeable to some extent too. Playing PUBG Mobile and I found that the Z Fold 8 Ultra could handle the highest graphics and performance settings without suffering any ill-effects. What's more the phone could run through a game without noticeably heating up, which suggests Samsung is putting that extra power to use in the right place.</p><h2 id="even-brighter-and-more-reflective-display">Even brighter and more reflective display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2801px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="wVVitwh992iiUo4GDVZM7F" name="Galaxy Z Fold 8 Ultra review-22" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/wVVitwh992iiUo4GDVZM7F-1920-80.jpg" mos="" align="middle" fullscreen="" width="2801" height="1576" attribution="" endorsement="" 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 minimized crease might be one of the main talking points for the Galaxy Z Fold 8 Ultra, but that's not the only upgrade Samsung has on offer. The Ultra now boasts an even brighter display, rated to output up to 3,000 nits of brightness, paired with a new anti-reflective coating. This means that the phone is supposed to be able to handle extremely bright conditions better than ever before.</p><p>Our testing showed that the Z Fold 8 Ultra was able to hit a maximum of 2,687 nits, which is a little bit lower than Samsung promised, but is par the course for how these things tend to go. Crucially, though, this actually makes the Z Fold 8 Ultra the brightest phone we've ever tested, narrowly beating out the current title-holder the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Google Pixel 10 Pro XL</a> — which we measured at 2,555 nits.</p><p>It's well ahead of the Z Fold 7's 2,245 nits, and leagues ahead of the 1,281 nit peak we recorded when testing the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a>.</p><p>Obviously big numbers are good, but they're worthless if they don't get put into practice. Thankfully the Z Fold 8 Ultra does put its money where its mouth is. We're currently experiencing an abnormally long period of clear skies and sunny weather here in the U.K., which is ideal for testing the capabilities of bright, anti-reflective screens. </p><p>Not only am I able to use the Galaxy Z Fold 8 Ultra in direct sunlight without issue, the screen is bright and clear enough that I can still see exactly what I'm doing while wearing sunglasses. That wouldn't have been the case three or four years ago.</p><h2 id="mostly-great-cameras">(Mostly) great cameras</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3143px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zQ46AeP4vRip5VZLsQx77F" name="Galaxy Z Fold 8 Ultra review-4" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/zQ46AeP4vRip5VZLsQx77F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3143" height="1768" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Seeing as how it includes the 200MP main camera lens from the S26 Ultra and Z Fold 7, alongside a new 50MP ultrawide angle camera, it's no surprise that the Galaxy Z Fold 8 Ultra takes some pretty great photos. Provided, of course, that you know which lens to utilize. </p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=68d559d2-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>The 200MP main lens really shines when compared to the iPhone 17 Pro Max — which is one of the <a href="https://www.tomsguide.com/us/best-phone-cameras,review-2272.html">best camera phones</a> you can buy right now. While both phones manage to capture true to life colors in good quality, the Z Fold 8 Ultra seems to have picked up a clearer and sharper image than the iPhone. That's especially true if you zoom in a little bit and look at all the smaller details.</p><p>Both phones seemed to take issue focusing on one of my dogs, though, and this is not the first time this has happened during camera testing. Once is an accident, but multiple instances of this make me wonder whether camera phones just hate my pooch.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=150fb8d2-8b0e-11f1-ba1b-0e6f42328d7d"></iframe><p>At first glance the ultrawide angle photography doesn't look all that different, but look closely and you can see how the Z Fold 8 Ultra is taking advantage of the various upgrades — the most prominent of which is the 50MP resolution bump. The details on the church are a lot  sharper than on the Z Fold 7, and you can pick out the smaller details without them merging into a washed out jumble of barely-describable details.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=df977e1a-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>Close-up macro-style shots are similar, though both phones seemed to struggle to focus on the berries directly in front of it. However, I will say that in light of those focus issues, telling them apart isn't that easy.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=fb3ab7c2-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>Low light photography has made some considerable improvements, with the Galaxy Z Fold 8 Ultra gaining access to the ProVisual engine and Advanced AP-based image processing — just like the Galaxy S26 Ultra. While the Z Fold 8 Ultra's low-light photos might look slightly darker than the Z Fold 7, they're capturing a heck of a lot more detail in the process. </p><p>You get a much clearer view of the various details in almost every aspect of the photo. The patchy coloring on the church's brickwork is clearer, while the individual stone decorations are sharper and considerably less fuzzy on the Z Fold 8 Ultra. Even the leaves on the trees can be picked out, rather than forming a giant green mass.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=3d5f6086-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>The iPhone 17 Pro Max definitely wins on the selfie front, and there's absolutely no contest. The Z Fold 8 Ultra's 10MP cameras just don't capture the same level of detail as Apple's front camera, and the lens-angle is a lot smaller so you end up capturing significantly less. Then again, both phones managed to hone in on the fact that I have a baby and haven't had anything like enough sleep in the nine months since he was born.</p><p>Honestly, while the Ultra's selfie camera isn't terrible, it's also nothing to brag about. To the point where you're probably better off using the 200MP main camera to snap selfies with the help of the cover display viewfinder.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=1fddabb2-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>When it comes to portrait mode, it feels like these are from two completely different points in time, rather than being snapped within seconds of each other. I'm not a fan of either photo, to be honest, but the iPhone 17 Pro Max still comes out ahead of the Z Fold 8 Ultra. It's a slightly clearer image, noticeably brighter, and captures a wider view of the world.</p><p>I'm not impressed with the bokeh in either photo, to be honest, since both phones struggled to handle the fact my hair was being whipped around by the wind at the time.</p><p>We haven't touched on the quality of the telephoto lens yet, but the truth is that the quality of those photos is so bad that I had to discuss them more in depth below.</p><h2 id="helpful-ai-features">Helpful AI 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:2951px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pKiVXcRJLTdYqY4LkYZS7W" name="Galaxy Z Fold 8 Ultra review-14" alt="samsung galaxy z fold 8 ultra review now nudge screen" src="https://cdn.mos.cms.futurecdn.net/pKiVXcRJLTdYqY4LkYZS7W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2951" height="1660" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>AI is a core part of the modern Galaxy experience, and the Z Fold 8 Ultra is no exception to this — though Samsung hasn't added as many features as you might have expected. The main one is the introduction of Now Nudge, a contextual AI tool that's capable of pulling up pieces of information whenever it feels you might need it — such as during phone calls or while browsing emails.</p><p>The Z Fold 8 Ultra ups the ante by blending Now Nudge with multitasking. This means you can tap on your nudged prompts and open up the relevant apps in split-screen mode, and keep your existing window open. The addition of Ambient Nudge also makes the whole process a lot more subtle, surfacing those contextual prompts at the bottom of your screen rather than with an in-your-face notification.</p><p>However my favorite new feature is <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-using-the-galaxy-z-fold-8s-myfancam-on-my-dogs-but-i-hit-a-major-wall">MyFanCam</a>, which takes your existing videos and lets you hone in on a single person and turn them into the main character. It works with all videos you've shot, even those not filmed on a Galaxy phone, and so far I haven't found a single video featuring human beings that it doesn't like. </p><p>The same can't be said for animals, though, and I found that the AI refused to acknowledge that you may want to focus your video on them.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-the-downs"><span>Samsung Galaxy Z Fold 8 Ultra review: The Downs</span></h2><h2 id="no-s-pen-or-magnets">No S Pen or magnets</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3384px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="DsnjPkJpoiWkgqzpb69L5F" name="Galaxy Z Fold 8 Ultra review-23" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/DsnjPkJpoiWkgqzpb69L5F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3384" height="1904" attribution="" endorsement="" 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 main issue I have with the Galaxy Z Fold 8 Ultra is that the design hasn't changed in any meaningful way since last year. It's not identical to the Z Fold 7, as I discovered when trying to use one of last year's cases on the Ultra model, but it's close enough that you wouldn't be able to tell without some well-calibrated measuring tools.</p><p>This naturally means that the design choices people didn't like about the Galaxy Z Fold 7 have stuck around for another generation. My personal pet peeve is that the phone still doesn't offer magnetic wireless charging without a case, despite offering Qi2 technology. It's an issue exacerbated by the fact Samsung originally said it was avoiding  Qi2 magnets because they interfered with the S Pen stylus. </p><p>Though that excuse doesn't really hold weight considering the Z Fold 8 Ultra doesn't have S Pen support either. That controversial change happened last year because Samsung removed the crucial digitizer layer to reduce thickness. Samsung has confirmed that it is <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">exploring alternative options</a>, but that doesn't change the fact the stylus is a glaring absence from this phone.</p><p>Using the Z Fold 8 Ultra and you can feel its absence. It feels like something is missing when you're using the large screen, and it's a void the stylus would have helped to fill.</p><h2 id="awful-telephoto-performance">Awful telephoto performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2546px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YoMrDg2aP5YQwYU9rTB4VE" name="Galaxy Z Fold 8 Ultra review-LIST3" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/YoMrDg2aP5YQwYU9rTB4VE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2546" height="1432" attribution="" endorsement="" 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 Z Fold 8 Ultra's camera quality may be pretty good compared to its rivals, there's no denying the fact that the telephoto lens is not doing a good job. The 10MP telephoto lens pales in comparison to the other two cameras, and bumping the magnification up makes it look considerably worse.</p><p>Even jumping up to 3x, the maximum level of optical zoom afforded by the lens, and you can see just how poor these photos actually are. Push it up even further and it feels like you might not have bothered taking the photos at all.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=57b402f6-8b0e-11f1-ba1b-0e6f42328d7d"></iframe><p>These 3x pictures of berries growing near my house aren't terrible at first glance, but when you compare them to the 50MP telephoto lens on the Galaxy S26 Ultra and you can see that Samsung really dropped the ball with this particular bit of hardware.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=6f308832-8b0e-11f1-ba1b-0e6f42328d7d"></iframe><p>The 10x zoomed photos of a local cat are even worse, to the point where I'm starting to wonder whether it was worth trying to zoom in at all. Samsung really needs to do a lot better, because the weak telephoto performance is weighing the rest of the cameras down — which is far from ideal when you have the 200MP main lens.</p><h2 id="another-100-price-hike">Another $100 price hike</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3195px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qXG8pNj9Zx45vEbwAzbc6F" name="Galaxy Z Fold 8 Ultra review-21" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/qXG8pNj9Zx45vEbwAzbc6F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3195" height="1797" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The biggest issue that we can't ignore is the fact that Samsung has raised the price of its flagship foldable by $100 for the third consecutive year. This means that the starting price is now $2,099 for a Z Fold 8 Ultra with 256GB of storage and 12GB of RAM. That price rises to $2,299 for a 512GB model and $2,699 for a 1TB model with 16GB of RAM.</p><p>It's no secret as to why this is happening. RAMageddon has pushed up the price of memory and storage to unprecedented levels, all while the overall cost of phone manufacturing has been rising over the past few years. A phone as difficult to mass produce as a foldable already commands a high price tag, but Samsung has clearly decided that the old prices still aren't high enough.</p><p>So while the new "Ultra" designation does come with a bunch of great upgrades, it doesn't change the fact that you're paying out of your nose for them.</p><p>Perhaps worst of all, Samsung isn't offering its usual "double storage" pre-order bonus this time, nor are there any other incentives to take advantage of. That means there isn't really a benefit to ordering early, unless you're absolutely desperate to get your hands on the Z Fold 8 Ultra as soon as possible.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-verdict"><span>Samsung Galaxy Z fold 8 Ultra 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:3352px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="GssiGQ7DwqV2epoxPbvf6F" name="Galaxy Z Fold 8 Ultra review-20" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/GssiGQ7DwqV2epoxPbvf6F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3352" height="1885" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It would have been really easy for Samsung to roll out the Galaxy Z Fold 8 Ultra with the usual weak-sauce upgrades, slap on the new name and call it a day. But that's not what's happened here, and while the phone may be imperfect, a lot of effort seems to have gone into making sure this is an upgrade worthy of the Ultra name.</p><p>Battery and performance have made huge leaps forward, to the point where it doesn't feel as though Samsung is deliberately holding back and limiting the foldable's capabilities in comparison to its non-folding counterparts. There's still some catching up to do in this regard, but it's certainly a big step forward. Likewise the improvement in screen technology is a massive win for users, especially those that live in spots with a lot of sun.</p><p>Of course there are a bunch of things Samsung should have anticipated would be a problem. Telephoto quality is appalling for a phone that costs this much, and the missing S Pen is still very noticeable. Worst of all is the increased price, which is just the latest in a long time of Galaxy price increases, and those basic flaws make it sting even harder.</p><p>Overall the Z Fold 8 Ultra is a great addition to the Galaxy Foldable lineup, but that doesn't mean Samsung should get complacent and let the innovations stagnate ahead of 2027's inevitable Z Fold 9 Ultra.</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-ultra-review</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Z Fold 8 Ultra feels like an Ultra device, thanks to major upgrades to its screen, performance and battery life. However there are some glaring issues that can't be ignored. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">B9fVAp2B9gLCieHSUmMW7U</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/b6wWCGt8Q3GaG3XvVfqE8F-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Jul 2026 12:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/b6wWCGt8Q3GaG3XvVfqE8F-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[samsung galaxy z fold 8 ultra review images]]></media:description>                                                            <media:text><![CDATA[samsung galaxy z fold 8 ultra review images]]></media:text>
                                <media:title type="plain"><![CDATA[samsung galaxy z fold 8 ultra review images]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/b6wWCGt8Q3GaG3XvVfqE8F-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung Galaxy Z Fold 8 Ultra is the start of something new, in a way that's a lot closer to how Samsung's non-folding phones have been operating for the past several years. Foldables are going Ultra, and it feels like Samsung is trying to push the idea that this isn't just a simple rebranding — there are some real changes behind the scenes.</p><p>There's more to new phones than adding flashier specs and bigger batteries, though, which is why I've been testing the Galaxy Z Fold 8 Ultra to see if it's really worthy of referring to itself as such. The good news is that this isn't just a boring incremental update with some new box art. The Z Fold 8 Ultra may share the same look as its predecessor, the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a>, but it actually feels like one of the more noteworthy upgrades to come out of Samsung for quite a few years.</p><p>Read on for our full Samsung Galaxy Z Fold 8 Ultra review.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-cheat-sheet"><span>Samsung Galaxy Z fold 8 Ultra review: Cheat Sheet</span></h2><ul><li><strong>What is it?</strong> The latest and best foldable to come out of Samsung, serving as a sequel to the Galaxy Z Fold 7 despite the addition of the Ultra branding.</li><li><strong>Who is it for?</strong> People who want the absolute best foldable experience possible, with the largest screen, and have the money to pay for it</li><li><strong>What does it cost? </strong>Prices start at $2,099 / £1,899 / AU$2,999 for a model with 256GB of storage and 12GB RAM. Release date is scheduled for August 7.</li><li><strong>What do we like? </strong>The Galaxy Z Fold 8 Ultra offers an incredible screen, that's brighter and less reflective than before, as well as powerful performance, good cameras, and the best battery life of any Galaxy foldable so far.</li><li><strong>What don't we like? </strong>Weak performance from the telephoto lens, the lack of S Pen stylus support, minimal design upgrades and the fact the price is $100 more than last year — marking the third consecutive Z Fold price hike.</li></ul><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-specifications"><span>Samsung Galaxy Z Fold 8 Ultra review: Specifications</span></h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>From $2,099 / £1,899 / AU$2,999</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong>    </p></td><td  ><p>8 inches AMOLED (2184 x 1968, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong>    </p></td><td  ><p>6.5 inches AMOLED (2520 x 1080, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB (16GB for 1TB)</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB/512GB/1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong>    </p></td><td  ><p>200MP wide, 50MP ultra-wide, 10MP telephoto (3x optical)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover camera</strong>    </p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Main display camera</strong>    </p></td><td  ><p>10MP </p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>45W wired / 20W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.16 inches) unfolded</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>215 grams (7.5 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong>    </p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Violet shadow, Cream, Graphite, Violet Green (online exclusive)</p></td></tr></tbody></table></div><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-the-ups"><span>Samsung Galaxy Z Fold 8 Ultra review:  The Ups</span></h2><h2 id="major-battery-life-gains">Major battery life gains</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2513px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="XqXqR7veof9Xv39t6m33WE" name="Galaxy Z Fold 8 Ultra review-17" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/XqXqR7veof9Xv39t6m33WE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2513" height="1414" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Samsung's foldables haven't always been known for their strong battery life, even as the flagship Galaxy S series pushes up our best phone battery life page. This year sees that change, and it's no doubt thanks to the larger 5,000 mAh battery pack. Not only is that the same size as the battery in the Galaxy S26 Ultra, it's also 600 mAh larger than the one in the Z Fold 7.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Hours : Minutes</strong></p></td><td  ><p><strong>Charging % in 30 minutes</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>14:33</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>12:19</p></td><td  ><p>70%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy 7 Fold 7</strong></p></td><td  ><p>10:44</p></td><td  ><p>54%</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>14:44</p></td><td  ><p>73%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>16:10</p></td><td  ><p>77%</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>17:54</p></td><td  ><p>64%</p></td></tr></tbody></table></div><p>During our custom battery life test, which involves web surfing over a 5G connection and setting the display to 150 nits of brightness, we recorded a battery life of 14 hours and 33 minutes. That's almost four hours more than the Z Fold 7 and more than two hours longer than the passport-shaped Galaxy Z Fold 8 and its 4,800 mAh battery. </p><p>However, it's not quite enough to match the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review">Galaxy S26 Ultra</a>, which scored 16 hours and 10 minutes, or the  14 hours and 44 minute battery life we recorded on the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-battery-life-test-results-are-in-and-it-sets-a-new-record-for-notebook-style-foldables">Motorola Razr Fold</a>.</p><p>During my time with the Z Fold Ultra, the battery seemed fairly strong, and I regularly went to sleep without plugging the foldable in to recharge overnight because I knew it would still be alive and kicking the very next morning. The faster 45W charging meant that I could plug the Ultra in while getting ready, comfortable in the knowledge that it would recharge enough to get me through the day.</p><p>Samsung promised that the Z Fold 8 Ultra could reclaim 67% battery after half an hour of charging, but we found the battery actually hit 76%. We're used to seeing recharge percentages differ from official figures by a percent or three, but it's rare that we see it go this far in the right direction.</p><p>On top of this, if you're more inclined to wireless charging, the upgraded Qi2.2 wireless charging protocol offers up to 20W speeds. That's up from 15W, but it does lag behind the likes of Apple and Google, who have offered 25W Qi2.2 speeds.</p><h2 id="major-league-performance">Major league performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3389px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="NNgZruxjbXt4XgkfTXQG6F" name="Galaxy Z Fold 8 Ultra review-11" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/NNgZruxjbXt4XgkfTXQG6F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3389" height="1906" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>This year marks the first time that Samsung has used the custom "for Galaxy" chipset in a foldable phone. Normally Z Fold models are left with the standard flagship Snapdragon chip which, while no slouch, isn't as powerful as the Galaxy S-exclusive variant. This means that this year's benchmarking scores are a little higher than we initially anticipated.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench (Single/Multicore)</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold Ultra</strong></p></td><td  ><p>3,733/11,457</p></td><td  ><p>49.24/12,950</p></td><td  ><p>71715</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>3,659/11,020</p></td><td  ><p>47.35/12,454</p></td><td  ><p>72242</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>2.711/9,134</p></td><td  ><p>35.12/9,413</p></td><td  ><p>59663</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>3,052/9,735</p></td><td  ><p>41.21/10,812</p></td><td  ><p>61299</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>3,785 / 11,563</p></td><td  ><p>49.37 / 12,984</p></td><td  ><p>83047 (TensorFlow Lite QNN)</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>3,871 / 9,968</p></td><td  ><p>46.6 / 12,260</p></td><td  ><p>48549 (Quantitized Score ML/Neural Engine)</p></td></tr></tbody></table></div><p>Geekbench 6 benchmarking saw the Z Fold 8 Ultra's Snapdragon 8 Elite Gen 5 for Galaxy chip hit a score of 3,733 on single core testing and 11,457 on multi core tests . That's up from 3,052 and 9,735 on the Z Fold 7's Snapdragon 8 Elite chip. </p><p>Graphics performance, scored using the 3DMark Solar Bay Unlimited test, also rose by a noticeable amount with a score of 12,950 and average frame rate of 49.24 fps. The Z Fold 7 only scores 10,812 and 41.21 fps. Meanwhile Geekbench AI scored 71,715 to the Z Fold 7's 61,299. The Ultra's figures also thrashed the Motorola Razr Fold, though they do trail the Galaxy S26 Ultra by a small amount</p><p>The performance improvements were noticeable to some extent too. Playing PUBG Mobile and I found that the Z Fold 8 Ultra could handle the highest graphics and performance settings without suffering any ill-effects. What's more the phone could run through a game without noticeably heating up, which suggests Samsung is putting that extra power to use in the right place.</p><h2 id="even-brighter-and-more-reflective-display">Even brighter and more reflective display</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2801px;"><p class="vanilla-image-block" style="padding-top:56.27%;"><img id="wVVitwh992iiUo4GDVZM7F" name="Galaxy Z Fold 8 Ultra review-22" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/wVVitwh992iiUo4GDVZM7F-1920-80.jpg" mos="" align="middle" fullscreen="" width="2801" height="1576" attribution="" endorsement="" 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 minimized crease might be one of the main talking points for the Galaxy Z Fold 8 Ultra, but that's not the only upgrade Samsung has on offer. The Ultra now boasts an even brighter display, rated to output up to 3,000 nits of brightness, paired with a new anti-reflective coating. This means that the phone is supposed to be able to handle extremely bright conditions better than ever before.</p><p>Our testing showed that the Z Fold 8 Ultra was able to hit a maximum of 2,687 nits, which is a little bit lower than Samsung promised, but is par the course for how these things tend to go. Crucially, though, this actually makes the Z Fold 8 Ultra the brightest phone we've ever tested, narrowly beating out the current title-holder the <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-xl-review">Google Pixel 10 Pro XL</a> — which we measured at 2,555 nits.</p><p>It's well ahead of the Z Fold 7's 2,245 nits, and leagues ahead of the 1,281 nit peak we recorded when testing the <a href="https://www.tomsguide.com/phones/iphones/iphone-17-pro-max-review">iPhone 17 Pro Max</a>.</p><p>Obviously big numbers are good, but they're worthless if they don't get put into practice. Thankfully the Z Fold 8 Ultra does put its money where its mouth is. We're currently experiencing an abnormally long period of clear skies and sunny weather here in the U.K., which is ideal for testing the capabilities of bright, anti-reflective screens. </p><p>Not only am I able to use the Galaxy Z Fold 8 Ultra in direct sunlight without issue, the screen is bright and clear enough that I can still see exactly what I'm doing while wearing sunglasses. That wouldn't have been the case three or four years ago.</p><h2 id="mostly-great-cameras">(Mostly) great cameras</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3143px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="zQ46AeP4vRip5VZLsQx77F" name="Galaxy Z Fold 8 Ultra review-4" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/zQ46AeP4vRip5VZLsQx77F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3143" height="1768" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Seeing as how it includes the 200MP main camera lens from the S26 Ultra and Z Fold 7, alongside a new 50MP ultrawide angle camera, it's no surprise that the Galaxy Z Fold 8 Ultra takes some pretty great photos. Provided, of course, that you know which lens to utilize. </p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=68d559d2-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>The 200MP main lens really shines when compared to the iPhone 17 Pro Max — which is one of the <a href="https://www.tomsguide.com/us/best-phone-cameras,review-2272.html">best camera phones</a> you can buy right now. While both phones manage to capture true to life colors in good quality, the Z Fold 8 Ultra seems to have picked up a clearer and sharper image than the iPhone. That's especially true if you zoom in a little bit and look at all the smaller details.</p><p>Both phones seemed to take issue focusing on one of my dogs, though, and this is not the first time this has happened during camera testing. Once is an accident, but multiple instances of this make me wonder whether camera phones just hate my pooch.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=150fb8d2-8b0e-11f1-ba1b-0e6f42328d7d"></iframe><p>At first glance the ultrawide angle photography doesn't look all that different, but look closely and you can see how the Z Fold 8 Ultra is taking advantage of the various upgrades — the most prominent of which is the 50MP resolution bump. The details on the church are a lot  sharper than on the Z Fold 7, and you can pick out the smaller details without them merging into a washed out jumble of barely-describable details.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=df977e1a-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>Close-up macro-style shots are similar, though both phones seemed to struggle to focus on the berries directly in front of it. However, I will say that in light of those focus issues, telling them apart isn't that easy.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=fb3ab7c2-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>Low light photography has made some considerable improvements, with the Galaxy Z Fold 8 Ultra gaining access to the ProVisual engine and Advanced AP-based image processing — just like the Galaxy S26 Ultra. While the Z Fold 8 Ultra's low-light photos might look slightly darker than the Z Fold 7, they're capturing a heck of a lot more detail in the process. </p><p>You get a much clearer view of the various details in almost every aspect of the photo. The patchy coloring on the church's brickwork is clearer, while the individual stone decorations are sharper and considerably less fuzzy on the Z Fold 8 Ultra. Even the leaves on the trees can be picked out, rather than forming a giant green mass.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=3d5f6086-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>The iPhone 17 Pro Max definitely wins on the selfie front, and there's absolutely no contest. The Z Fold 8 Ultra's 10MP cameras just don't capture the same level of detail as Apple's front camera, and the lens-angle is a lot smaller so you end up capturing significantly less. Then again, both phones managed to hone in on the fact that I have a baby and haven't had anything like enough sleep in the nine months since he was born.</p><p>Honestly, while the Ultra's selfie camera isn't terrible, it's also nothing to brag about. To the point where you're probably better off using the 200MP main camera to snap selfies with the help of the cover display viewfinder.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=1fddabb2-8b0d-11f1-ba1b-0e6f42328d7d"></iframe><p>When it comes to portrait mode, it feels like these are from two completely different points in time, rather than being snapped within seconds of each other. I'm not a fan of either photo, to be honest, but the iPhone 17 Pro Max still comes out ahead of the Z Fold 8 Ultra. It's a slightly clearer image, noticeably brighter, and captures a wider view of the world.</p><p>I'm not impressed with the bokeh in either photo, to be honest, since both phones struggled to handle the fact my hair was being whipped around by the wind at the time.</p><p>We haven't touched on the quality of the telephoto lens yet, but the truth is that the quality of those photos is so bad that I had to discuss them more in depth below.</p><h2 id="helpful-ai-features">Helpful AI 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:2951px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="pKiVXcRJLTdYqY4LkYZS7W" name="Galaxy Z Fold 8 Ultra review-14" alt="samsung galaxy z fold 8 ultra review now nudge screen" src="https://cdn.mos.cms.futurecdn.net/pKiVXcRJLTdYqY4LkYZS7W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2951" height="1660" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>AI is a core part of the modern Galaxy experience, and the Z Fold 8 Ultra is no exception to this — though Samsung hasn't added as many features as you might have expected. The main one is the introduction of Now Nudge, a contextual AI tool that's capable of pulling up pieces of information whenever it feels you might need it — such as during phone calls or while browsing emails.</p><p>The Z Fold 8 Ultra ups the ante by blending Now Nudge with multitasking. This means you can tap on your nudged prompts and open up the relevant apps in split-screen mode, and keep your existing window open. The addition of Ambient Nudge also makes the whole process a lot more subtle, surfacing those contextual prompts at the bottom of your screen rather than with an in-your-face notification.</p><p>However my favorite new feature is <a href="https://www.tomsguide.com/phones/samsung-phones/i-tried-using-the-galaxy-z-fold-8s-myfancam-on-my-dogs-but-i-hit-a-major-wall">MyFanCam</a>, which takes your existing videos and lets you hone in on a single person and turn them into the main character. It works with all videos you've shot, even those not filmed on a Galaxy phone, and so far I haven't found a single video featuring human beings that it doesn't like. </p><p>The same can't be said for animals, though, and I found that the AI refused to acknowledge that you may want to focus your video on them.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-the-downs"><span>Samsung Galaxy Z Fold 8 Ultra review: The Downs</span></h2><h2 id="no-s-pen-or-magnets">No S Pen or magnets</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3384px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="DsnjPkJpoiWkgqzpb69L5F" name="Galaxy Z Fold 8 Ultra review-23" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/DsnjPkJpoiWkgqzpb69L5F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3384" height="1904" attribution="" endorsement="" 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 main issue I have with the Galaxy Z Fold 8 Ultra is that the design hasn't changed in any meaningful way since last year. It's not identical to the Z Fold 7, as I discovered when trying to use one of last year's cases on the Ultra model, but it's close enough that you wouldn't be able to tell without some well-calibrated measuring tools.</p><p>This naturally means that the design choices people didn't like about the Galaxy Z Fold 7 have stuck around for another generation. My personal pet peeve is that the phone still doesn't offer magnetic wireless charging without a case, despite offering Qi2 technology. It's an issue exacerbated by the fact Samsung originally said it was avoiding  Qi2 magnets because they interfered with the S Pen stylus. </p><p>Though that excuse doesn't really hold weight considering the Z Fold 8 Ultra doesn't have S Pen support either. That controversial change happened last year because Samsung removed the crucial digitizer layer to reduce thickness. Samsung has confirmed that it is <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">exploring alternative options</a>, but that doesn't change the fact the stylus is a glaring absence from this phone.</p><p>Using the Z Fold 8 Ultra and you can feel its absence. It feels like something is missing when you're using the large screen, and it's a void the stylus would have helped to fill.</p><h2 id="awful-telephoto-performance">Awful telephoto performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2546px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="YoMrDg2aP5YQwYU9rTB4VE" name="Galaxy Z Fold 8 Ultra review-LIST3" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/YoMrDg2aP5YQwYU9rTB4VE-1920-80.jpg" mos="" align="middle" fullscreen="" width="2546" height="1432" attribution="" endorsement="" 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 Z Fold 8 Ultra's camera quality may be pretty good compared to its rivals, there's no denying the fact that the telephoto lens is not doing a good job. The 10MP telephoto lens pales in comparison to the other two cameras, and bumping the magnification up makes it look considerably worse.</p><p>Even jumping up to 3x, the maximum level of optical zoom afforded by the lens, and you can see just how poor these photos actually are. Push it up even further and it feels like you might not have bothered taking the photos at all.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=57b402f6-8b0e-11f1-ba1b-0e6f42328d7d"></iframe><p>These 3x pictures of berries growing near my house aren't terrible at first glance, but when you compare them to the 50MP telephoto lens on the Galaxy S26 Ultra and you can see that Samsung really dropped the ball with this particular bit of hardware.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=6f308832-8b0e-11f1-ba1b-0e6f42328d7d"></iframe><p>The 10x zoomed photos of a local cat are even worse, to the point where I'm starting to wonder whether it was worth trying to zoom in at all. Samsung really needs to do a lot better, because the weak telephoto performance is weighing the rest of the cameras down — which is far from ideal when you have the 200MP main lens.</p><h2 id="another-100-price-hike">Another $100 price hike</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3195px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qXG8pNj9Zx45vEbwAzbc6F" name="Galaxy Z Fold 8 Ultra review-21" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/qXG8pNj9Zx45vEbwAzbc6F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3195" height="1797" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The biggest issue that we can't ignore is the fact that Samsung has raised the price of its flagship foldable by $100 for the third consecutive year. This means that the starting price is now $2,099 for a Z Fold 8 Ultra with 256GB of storage and 12GB of RAM. That price rises to $2,299 for a 512GB model and $2,699 for a 1TB model with 16GB of RAM.</p><p>It's no secret as to why this is happening. RAMageddon has pushed up the price of memory and storage to unprecedented levels, all while the overall cost of phone manufacturing has been rising over the past few years. A phone as difficult to mass produce as a foldable already commands a high price tag, but Samsung has clearly decided that the old prices still aren't high enough.</p><p>So while the new "Ultra" designation does come with a bunch of great upgrades, it doesn't change the fact that you're paying out of your nose for them.</p><p>Perhaps worst of all, Samsung isn't offering its usual "double storage" pre-order bonus this time, nor are there any other incentives to take advantage of. That means there isn't really a benefit to ordering early, unless you're absolutely desperate to get your hands on the Z Fold 8 Ultra as soon as possible.</p><h2 class="article-body__section" id="section-samsung-galaxy-z-fold-8-ultra-review-verdict"><span>Samsung Galaxy Z fold 8 Ultra 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:3352px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="GssiGQ7DwqV2epoxPbvf6F" name="Galaxy Z Fold 8 Ultra review-20" alt="samsung galaxy z fold 8 ultra review images" src="https://cdn.mos.cms.futurecdn.net/GssiGQ7DwqV2epoxPbvf6F-1920-80.jpg" mos="" align="middle" fullscreen="" width="3352" height="1885" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It would have been really easy for Samsung to roll out the Galaxy Z Fold 8 Ultra with the usual weak-sauce upgrades, slap on the new name and call it a day. But that's not what's happened here, and while the phone may be imperfect, a lot of effort seems to have gone into making sure this is an upgrade worthy of the Ultra name.</p><p>Battery and performance have made huge leaps forward, to the point where it doesn't feel as though Samsung is deliberately holding back and limiting the foldable's capabilities in comparison to its non-folding counterparts. There's still some catching up to do in this regard, but it's certainly a big step forward. Likewise the improvement in screen technology is a massive win for users, especially those that live in spots with a lot of sun.</p><p>Of course there are a bunch of things Samsung should have anticipated would be a problem. Telephoto quality is appalling for a phone that costs this much, and the missing S Pen is still very noticeable. Worst of all is the increased price, which is just the latest in a long time of Galaxy price increases, and those basic flaws make it sting even harder.</p><p>Overall the Z Fold 8 Ultra is a great addition to the Galaxy Foldable lineup, but that doesn't mean Samsung should get complacent and let the innovations stagnate ahead of 2027's inevitable Z Fold 9 Ultra.</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ The tech world hyped up the Galaxy Z Fold 8's 'crease-free' display — here's a reality check after 7 days ]]></title>
                                                                                                <dc:content><![CDATA[ <p>A few days ago, I wrote that the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>'s crease practically disappeared in daily use. Samsung's new titanium alloy film and reinforced back plate seemed to have solved the foldable world's biggest annoyance. I was impressed. </p><p><a href="https://www.tomsguide.com/phones/samsung-phones/my-first-36-hours-with-the-samsung-galaxy-z-fold-8-i-was-wrong-about-the-passport-screen-but-that-usd1-899-price-still-stings">But that was day 1</a>. Welcome to day 7.</p><p>I thought I was gaslighting myself into seeing more of a crease in my day-to-day (and in the photos from our review). But I'm not going crazy — after seeing validation on X/Twitter, turns out wear and tear <em>does catch up to this thing</em>.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2082186881920385130"><p lang="en" dir="ltr">Ten sam #GalaxyZFold8Zdjęcie nr 1: po wyjęciu z pudełkaZdjęcie nr 2: po paru dniach używania Czytaj bruzdy nie ma tylko pierwszego dnia 🫠👌 pic.twitter.com/BhnJHUqP7S<a href="https://twitter.com/cantworkitout/status/2082186881920385130">July 28, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><h2 id="the-7-day-reality-check">The 7-day reality 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6bxGdiam3BDqcSojZNdkyR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/6bxGdiam3BDqcSojZNdkyR-1920-80.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>A week of daily driving, big-screen use in between sets at the gym, web browsing and TikTok scrolling has taken its toll. Folding a screen, no matter how creaseless, will make a crease after 168 hours.</p><p>So what happened? From my years of testing all kinds of foldable displays, one thing has always become clear: nobody can defeat the law of physics.</p><p>When you first pull the Z Fold 8 out of the box, the ultra-thin glass and additional protective layers are fresh, pulling completely taut across the hinge. But after a week of real-world use — folding and unfolding it a hundred times a day, letting the device heat up during intense multitasking and stuffing it into tight pockets — I believe those display layers undergo mechanical fatigue.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2682px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="4RtoBDsrwS8sGu7dtM78Xh" name="Galaxy Z Fold 8 review-LIST1" alt="Samsung Galaxy Z Fold 8 shown open on a stone bench" src="https://cdn.mos.cms.futurecdn.net/4RtoBDsrwS8sGu7dtM78Xh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2682" height="1509" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Engineers call it <a href="https://www.sciencedirect.com/topics/engineering/plastic-deformation" target="_blank">"plastic deformation."</a> The continuous stress of bowing into the hinge's teardrop cavity, combined with the heat of the device, causes the materials to lose their factory-fresh tension. They slowly begin to settle into the mechanical trench underneath the display.</p><p>That titanium alloy film and back plate may be stronger, but that screen still has to obey the mechanical reality of being folded in half. And the result is that by the end of week one, that invisible crease will settle into a visible rut.</p><p>I've seen this happen to every foldable — be it the <a href="https://www.tomsguide.com/phones/android-phones/honor-magic-v6-hands-on-review">Honor Magic V6</a>, <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Google Pixel 10 Pro Fold</a> or <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2025-review">Motorola Razr Ultra</a>.</p><h2 id="how-bad-is-it-actually">How bad is it actually?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3451px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="xZsjHaJtbzrYXaZVDzajdZ" name="Galaxy Z Fold 8 review-19" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xZsjHaJtbzrYXaZVDzajdZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3451" height="1941" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In short: <strong>it's not.</strong></p><p>Let me be completely clear here. This is not a bad phone because of a display crease. In fact, this passport-size form factor won me over compared to the taller options — being much more pocketable and a better aspect ratio for content consumption.</p><p>That being said, a lot of journalists have been quick to describe the display as being "virtually crease-free" (even though Samsung never said that itself). So let's go deeper on this reality check.</p><p>The feel of it remains unchanged both before and after the trench deepened. You can subtly feel it with your finger whether the display tension is there or not. So this is definitely just a visual thing you'll notice when the screen catches a glare.</p><p>And speaking of the glare, while that anti-reflective coating is great, I feel it almost highlights the crease <em>more </em>when held against a harsh light source (like a sunlit window) because the distortion in the reflection becomes more obvious.</p><h2 id="the-1-899-question">The $1,899 question</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xc3WRniTc8DtiEFDN5rGqC" name="Galaxy Z Fold 8 in hand" alt="Samsung Galaxy Z Fold 8 in hand" src="https://cdn.mos.cms.futurecdn.net/xc3WRniTc8DtiEFDN5rGqC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now, is this a dealbreaker? If you're paying nearly $2,000 for a premium device, it's fair to expect premium longevity. However, I'll go out on a limb and say <strong>it's not as big of a problem as you think.</strong></p><p>The Z Fold 8 is still a fantastic foldable with a form factor that I love. And to Samsung's credit, the crease is definitely less noticeable now than it's been on the company's previous phones. But with the "crease-free" word on the street, it's only fair that I make it clear that this is a temporary illusion, not a permanent feature.</p><p>That being said, I'm just one person spouting my thoughts. I'd love to know what you think. Let me know below — are you planning to pick up the Z Fold 8?</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OqRMmX"></div>                            </div>                            <script src="https://kwizly.com/embed/OqRMmX.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/phones/i-shot-the-same-25-photos-with-a-usd329-budget-phone-and-usd1-199-flagship-heres-the-results">I shot the same 25 photos with a $329 budget phone and $1,199 flagship — here's the results</a></li><li><a href="https://www.tomsguide.com/phones/i-got-sick-of-buying-cases-for-my-phones-so-i-decided-to-3d-print-them-at-home-heres-what-happened">I got sick of buying cases for my phones, so I decided to 3D print them at home — here's what happened</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing">I took the Galaxy Z Fold 8 Ultra vs Fold 7 outside — and the difference is so drastic people think I faked the results</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/the-tech-world-hyped-up-the-galaxy-z-fold-8s-crease-free-display-heres-a-reality-check-after-7-days</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Z Fold 8 display looked flawless for the first 36 hours, but after just 7 days of use, the crease is back. See the photographic proof. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">4y3sWgJA7HXsgsPQJda2UK</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/eMykzuMeNevgMvexw4ydne-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 30 Jul 2026 11:39:47 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Jul 2026 20:15:46 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/eMykzuMeNevgMvexw4ydne-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/eMykzuMeNevgMvexw4ydne-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>A few days ago, I wrote that the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win">Galaxy Z Fold 8</a>'s crease practically disappeared in daily use. Samsung's new titanium alloy film and reinforced back plate seemed to have solved the foldable world's biggest annoyance. I was impressed. </p><p><a href="https://www.tomsguide.com/phones/samsung-phones/my-first-36-hours-with-the-samsung-galaxy-z-fold-8-i-was-wrong-about-the-passport-screen-but-that-usd1-899-price-still-stings">But that was day 1</a>. Welcome to day 7.</p><p>I thought I was gaslighting myself into seeing more of a crease in my day-to-day (and in the photos from our review). But I'm not going crazy — after seeing validation on X/Twitter, turns out wear and tear <em>does catch up to this thing</em>.</p><div class="see-more see-more--clipped"><figure><blockquote class="twitter-tweet hawk-ignore" data-lang="en" cite="https://twitter.com/cantworkitout/status/2082186881920385130"><p lang="en" dir="ltr">Ten sam #GalaxyZFold8Zdjęcie nr 1: po wyjęciu z pudełkaZdjęcie nr 2: po paru dniach używania Czytaj bruzdy nie ma tylko pierwszego dnia 🫠👌 pic.twitter.com/BhnJHUqP7S<a href="https://twitter.com/cantworkitout/status/2082186881920385130">July 28, 2026</a></p></blockquote></figure><div class="see-more__filter"></div></div><h2 id="the-7-day-reality-check">The 7-day reality 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="6bxGdiam3BDqcSojZNdkyR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/6bxGdiam3BDqcSojZNdkyR-1920-80.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>A week of daily driving, big-screen use in between sets at the gym, web browsing and TikTok scrolling has taken its toll. Folding a screen, no matter how creaseless, will make a crease after 168 hours.</p><p>So what happened? From my years of testing all kinds of foldable displays, one thing has always become clear: nobody can defeat the law of physics.</p><p>When you first pull the Z Fold 8 out of the box, the ultra-thin glass and additional protective layers are fresh, pulling completely taut across the hinge. But after a week of real-world use — folding and unfolding it a hundred times a day, letting the device heat up during intense multitasking and stuffing it into tight pockets — I believe those display layers undergo mechanical fatigue.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2682px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="4RtoBDsrwS8sGu7dtM78Xh" name="Galaxy Z Fold 8 review-LIST1" alt="Samsung Galaxy Z Fold 8 shown open on a stone bench" src="https://cdn.mos.cms.futurecdn.net/4RtoBDsrwS8sGu7dtM78Xh-1920-80.jpg" mos="" align="middle" fullscreen="" width="2682" height="1509" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Engineers call it <a href="https://www.sciencedirect.com/topics/engineering/plastic-deformation" target="_blank">"plastic deformation."</a> The continuous stress of bowing into the hinge's teardrop cavity, combined with the heat of the device, causes the materials to lose their factory-fresh tension. They slowly begin to settle into the mechanical trench underneath the display.</p><p>That titanium alloy film and back plate may be stronger, but that screen still has to obey the mechanical reality of being folded in half. And the result is that by the end of week one, that invisible crease will settle into a visible rut.</p><p>I've seen this happen to every foldable — be it the <a href="https://www.tomsguide.com/phones/android-phones/honor-magic-v6-hands-on-review">Honor Magic V6</a>, <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Google Pixel 10 Pro Fold</a> or <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2025-review">Motorola Razr Ultra</a>.</p><h2 id="how-bad-is-it-actually">How bad is it actually?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3451px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="xZsjHaJtbzrYXaZVDzajdZ" name="Galaxy Z Fold 8 review-19" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xZsjHaJtbzrYXaZVDzajdZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3451" height="1941" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>In short: <strong>it's not.</strong></p><p>Let me be completely clear here. This is not a bad phone because of a display crease. In fact, this passport-size form factor won me over compared to the taller options — being much more pocketable and a better aspect ratio for content consumption.</p><p>That being said, a lot of journalists have been quick to describe the display as being "virtually crease-free" (even though Samsung never said that itself). So let's go deeper on this reality check.</p><p>The feel of it remains unchanged both before and after the trench deepened. You can subtly feel it with your finger whether the display tension is there or not. So this is definitely just a visual thing you'll notice when the screen catches a glare.</p><p>And speaking of the glare, while that anti-reflective coating is great, I feel it almost highlights the crease <em>more </em>when held against a harsh light source (like a sunlit window) because the distortion in the reflection becomes more obvious.</p><h2 id="the-1-899-question">The $1,899 question</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xc3WRniTc8DtiEFDN5rGqC" name="Galaxy Z Fold 8 in hand" alt="Samsung Galaxy Z Fold 8 in hand" src="https://cdn.mos.cms.futurecdn.net/xc3WRniTc8DtiEFDN5rGqC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Now, is this a dealbreaker? If you're paying nearly $2,000 for a premium device, it's fair to expect premium longevity. However, I'll go out on a limb and say <strong>it's not as big of a problem as you think.</strong></p><p>The Z Fold 8 is still a fantastic foldable with a form factor that I love. And to Samsung's credit, the crease is definitely less noticeable now than it's been on the company's previous phones. But with the "crease-free" word on the street, it's only fair that I make it clear that this is a temporary illusion, not a permanent feature.</p><p>That being said, I'm just one person spouting my thoughts. I'd love to know what you think. Let me know below — are you planning to pick up the Z Fold 8?</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-OqRMmX"></div>                            </div>                            <script src="https://kwizly.com/embed/OqRMmX.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/phones/i-shot-the-same-25-photos-with-a-usd329-budget-phone-and-usd1-199-flagship-heres-the-results">I shot the same 25 photos with a $329 budget phone and $1,199 flagship — here's the results</a></li><li><a href="https://www.tomsguide.com/phones/i-got-sick-of-buying-cases-for-my-phones-so-i-decided-to-3d-print-them-at-home-heres-what-happened">I got sick of buying cases for my phones, so I decided to 3D print them at home — here's what happened</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing">I took the Galaxy Z Fold 8 Ultra vs Fold 7 outside — and the difference is so drastic people think I faked the results</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Fold 8 review: The best foldable for most people ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I’ve been reviewing <a href="https://www.tomsguide.com/best-picks/best-foldable-phones"><u>foldable phones</u></a> since the very first Galaxy Z Fold, and there’s something that’s “just right” about the Galaxy Z Fold 8. It’s super light, gives you a wide front display, and the big inside screen has two distinct orientations for video watching and browsing or reading.</p><p>Other perks include a much less noticeable crease, an anti-reflective coating for the main display and handy new AI features that take full advantage of the wide canvas.</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/SMwClG9-nR0" allowfullscreen></iframe></div></div><p>But Samsung has definitely made some trade-offs, like no telephoto zoom lens. But now that I’ve been living with the Fold 8 for a few weeks, this feels like the future of foldables — and not just because Apple is reportedly making one just like this.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-review-release-date-and-price"><span>Galaxy Z Fold 8 review: Release date and price</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="F6qr2SDN3gLqxsmgpqVYsY" name="Fold 8 back 2" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/F6qr2SDN3gLqxsmgpqVYsY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Galaxy Z Fold 8 is just 7 ounces and easy to slip into a pocket. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 has a release date of August 7th and is available now.</p><p>This foldable has a starting price of $1,899/£1,699/AU$2,699 for 12GB of RAM and 256GB of storage. You’ll pay $2,099 or $200 more for the 512GB model and $2,499 for the 1TB Fold 8 with 16GB of RAM and 1TB of storage.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p><strong>RAM</strong></p></td><td  ><p><strong>United States</strong></p></td><td  ><p><strong>United Kingdom</strong></p></td><td  ><p><strong>Australia</strong></p></td></tr><tr><td class="firstcol " ><p><strong>256GB</strong></p></td><td  ><p>12GB</p></td><td  ><p>$1,899.99</p></td><td  ><p>£1,699.00</p></td><td  ><p>AU$2,699.00</p></td></tr><tr><td class="firstcol " ><p><strong>512GB</strong></p></td><td  ><p>12GB</p></td><td  ><p>$2,099.99</p></td><td  ><p>£1,869.00</p></td><td  ><p>AU$2,999.00</p></td></tr><tr><td class="firstcol " ><p><strong>1TB</strong></p></td><td  ><p>16GB</p></td><td  ><p>$2,499.99</p></td><td  ><p>£2,209.00</p></td><td  ><p>AU$3,599.00</p></td></tr></tbody></table></div><p>The Galaxy Z Fold 8 Ultra starts at a steeper $2,099, but it also gives you bigger displays, a telephoto zoom and larger battery.</p><h2 id="galaxy-z-fold-8-specs">Galaxy Z Fold 8 specs</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $1,899 / £1,699 /  AU$2,699</p></td></tr><tr><td class="firstcol " ><p><strong>Release Date</strong></p></td><td  ><p>August 7</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong></p></td><td  ><p>5.5 inches </p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong></p></td><td  ><p>7.6 inches </p></td></tr><tr><td class="firstcol " ><p><strong>Chip </strong></p></td><td  ><p>Snapdragon 8 Elite </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB, 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP wide, 50MP Ultra wide (10x digital zoom)</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie cameras</strong></p></td><td  ><p>10MP (main), 10MP (cover)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery </strong></p></td><td  ><p>4,800 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Wired/Wireless Charging</strong></p></td><td  ><p>45W, 20W</p></td></tr><tr><td class="firstcol " ><p><strong>Size open</strong></p></td><td  ><p>161.4 x 123.9 x 4.5 mm (unfolded)</p></td></tr><tr><td class="firstcol " ><p><strong>Size closed</strong></p></td><td  ><p>123.9 x 81.9 x 9.7 mm (4.88 × 3.22 × 0.38 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>201 grams (7.09 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Lavender, Graphite, Cream, Pistachio (online)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-what-i-like"><span>What I Like</span></h3><h2 id="the-passport-like-design">The passport-like design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2380px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="mvgDxNKt4bSCeKgLQJrseY" name="Galaxy Z Fold 8 review-5" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/mvgDxNKt4bSCeKgLQJrseY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2380" height="1339" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The 5.5-inch cover display is short but wide enough to run apps comfortably. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Z Fold 8 is about the same size as a passport, which makes it really easy to slip into a front pocket. And at 201 grams (7.1 ounces), this is the lightest book-style foldable in the world.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3540px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="xWJMf4qbWeA7HP2ocEhjbZ" name="Galaxy Z Fold 8 review-7" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xWJMf4qbWeA7HP2ocEhjbZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3540" height="1991" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The front screen is tailor-made for TikTok scrolling. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I really like the 10:16 front display for scrolling through TikTok videos, and there’s plenty of room for typing with two hands. Reaching across the display with one hand can be a stretch, but overall using the Fold 8 just feels right compared to the taller Fold 8 Ultra.</p><p>Plus, opening the display is a lot easier versus the Galaxy Z Fold 7 and the Fold 8 unfolds almost perfectly flat. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2693px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="xsfHUrdQAp5k99yND4fgSY" name="Galaxy Z Fold 8 review-26" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xsfHUrdQAp5k99yND4fgSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2693" height="1515" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Thanks to Flex Titanium tech, the Galaxy Fold 8 is flat when unfolded. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As for colors, the Fold 8 comes in Lavender, Graphite and Cream, and there’s a Pistachio option online only. I prefer the Lavender hue on our review unit because it has more personality.</p><h2 id="the-display-is-awesome-especially-anti-glare-coating">The display is awesome (especially anti-glare coating)</h2><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.26%;"><img id="Yi3SX3rGdTkh5HdALu76vY" name="Galaxy Z Fold 8 review-LIST2" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/Yi3SX3rGdTkh5HdALu76vY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2188" height="1231" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The anti-reflective 7.6-inch screen cuts down on glare outdoors.  </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If the crease on foldable phones has always bugged you, the Galaxy Z Fold 8’s main 7.6-inch display will make you happy. Thanks to Flex Titanium tech, the crease is much less visible than before.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2274px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="PP6Mk9VYuCweU6oJKijdcZ" name="Galaxy Z Fold 8 review-17" alt="Galaxy Z Fold 8 (right)" src="https://cdn.mos.cms.futurecdn.net/PP6Mk9VYuCweU6oJKijdcZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2274" height="1279" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Fold 8 has smaller black bars but the viewing area is the same as Fold 8 Ultra. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung paired a titanium alloy film with a titanium base plate with micro-perforations that allow the display stack to adhere flush to the plate with virtually no air gaps. The result is a crease you can still feel but almost disappears when you’re viewing content. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@mspoonyg/video/7666429528071294222" data-video-id="7666429528071294222" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@mspoonyg" href="https://www.tiktok.com/@mspoonyg">@mspoonyg</a>                            <p></p><a target="_blank" title="♬ Thank You for Sunshine - House Duduk Music" href="https://www.tiktok.com/music/Thank-You-for-Sunshine-7650727836295612417">♬ Thank You for Sunshine - House Duduk Music</a></section>                    </blockquote></div>                <p>The bigger deal for me is the anti-reflective coating. It drastically cuts down on glare when viewing the Fold 8 outside. Check out the difference between the new Fold and the Fold 7.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XviVgfrucnRziFPJAYgcpA" name="Fold 8 display spider-man" alt="Galaxy Z Fold 8 Spider Man Brand New Day trailer" src="https://cdn.mos.cms.futurecdn.net/XviVgfrucnRziFPJAYgcpA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The main 7.6-inch display has a 4:3 aspect ratio when you open it up. The benefit here is that you get smaller black bars above and below the display when watching videos versus the more square 8-inch Fold 8 Ultra.</p><p>The viewing area itself is not larger, but I found watching the Red Hot Chili Peppers documentary on Netflix pretty immersive, as well as the “Avengers: Doomsday” trailer.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rN8FsPNnJYUuecJ9J2oHpA" name="Fold 8 display 3.4" alt="Galaxy Z Fold 8 3:4 display for reading" src="https://cdn.mos.cms.futurecdn.net/rN8FsPNnJYUuecJ9J2oHpA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When you flip the Fold 8 around into portrait mode with the main display open, you get a 3:4 aspect ratio. This gives you more real estate vertically, making it the better option for surfing the web and reading ebooks.</p><h2 id="helpful-ai-features-2">Helpful AI 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aU3ngqVpjk6ewWQungWboA" name="Fold 8 Now Nudge" alt="Galaxy Z Fold 8 Now Nudge AI feature" src="https://cdn.mos.cms.futurecdn.net/aU3ngqVpjk6ewWQungWboA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Now Nudge will suggest apps to open in multi-window mode. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Samsung Galaxy Z Fold 8 has some AI features that I really like.</p><p>My favorite is Now Nudge, which prompts you to open a related app in Split View without having to leave the app you’re currently using.</p><p>For example, I received a text message asking if I was free for dinner next Friday at 7 p.m. A little calendar icon appeared, and when I tapped that I opened the Calendar app in split screen mode. That’s pretty handy.</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/6m04UbLVC9E" allowfullscreen></iframe></div></div><p>Another super useful AI feature is My FanCam. When editing a video with multiple people in the frame, you can select the subject you want, and the Fold 8 will crop in and “follow” that person throughout the clip.</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/aFwm3S3JDE0" allowfullscreen></iframe></div></div><p>You can even choose the aspect ratio. This is great for sports parents, concert lovers and more, though it only works on humans — and only one at a time.</p><h2 id="very-snappy-performance">Very snappy performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3508px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="CnV2R6YCsPFej5e7GpiWfZ" name="Galaxy Z Fold 8 review-24" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/CnV2R6YCsPFej5e7GpiWfZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3508" height="1973" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Fold 8 is a blast for playing games on the go. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p><br>Powered by a Snapdragon 8 Elite Gen 5 for Galaxy chip, the Galaxy Z Fold 8 offers flagship-level performance on par with the Galaxy S26 Ultra. I mowed down several enemies in Call of Duty Mobile and raced around tracks in Asphalt 8 without seeing any slowdowns.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench (Single/Multicore)</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI </strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>3,659/11,020</p></td><td  ><p>47.35/12,454</p></td><td  ><p>72242</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold </strong></p></td><td  ><p>2.711/9,134</p></td><td  ><p>35.12/9,413</p></td><td  ><p>59663</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>3,052/9,735</p></td><td  ><p>41.21/10,812</p></td><td  ><p>61,299</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>3,785 / 11,563</p></td><td  ><p>49.37 / 12,984</p></td><td  ><p>83047 (TensorFlow Lite QNN)</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>3,871 / 9,968</p></td><td  ><p>46.6 / 12,260</p></td><td  ><p>48549 (Quantitized Score ML/Neural Engine)</p></td></tr></tbody></table></div><p>The Fold 8 is also a multitasking champ. I could run up to three apps on screen at once without any noticeable lag. For example, I scrolled through my inbox in Gmail while playing 311 Radio on Spotify and skimming through and zooming in on my photos in the Gallery app.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2879px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="77ZTA3cHAT3JoQVSNWAUNW" name="Galaxy Z Fold 8-15" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/77ZTA3cHAT3JoQVSNWAUNW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2879" height="1619" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Galaxy Z Fold 8 can run three apps at once. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Z Fold 8 performed very well on our lab tests, too. It beats the iPhone 17 Pro Max on multi-core performance in Geekbench and in the 3DMark graphics benchmark.</p><h2 id="solid-battery-life-faster-charging">Solid battery life, faster charging</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2RjVPjGpSRDgg7JtX5ooKg" name="Fold 8 back" alt="Galaxy Z Fold 8 back side" src="https://cdn.mos.cms.futurecdn.net/2RjVPjGpSRDgg7JtX5ooKg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 is one of the first Samsung phones to offer a silicon carbon battery, which allows for more capacity without adding thickness to the phone. The Fold 8 has a 4,800 mAh battery, compared to just a 4,400 mAh Li-ion battery on the previous Fold 7.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>Hours : Minutes</strong></p></td><td  ><p><strong>Charging % in 30 minutes</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>12:19</p></td><td  ><p>70%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>14:33</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy 7 Fold 7</strong></p></td><td  ><p>10:44</p></td><td  ><p>54%</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>14:44</p></td><td  ><p>73%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>16:10</p></td><td  ><p>77%</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>17:54</p></td><td  ><p>64%</p></td></tr></tbody></table></div><p>On the Tom’s Guide battery test, which consists of web surfing over 5G, the Fold 8 lasted a pretty good 12 hours and 19 minutes. That beats the Fold 7 by nearly 1.5 hours, though the Fold 8 isn’t good enough to make our <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html"><u>best phone battery life</u></a> list.</p><p>In my time with the phone I enjoyed fairly strong endurance. For example, after a day of mixed usage, including checking email, capturing photos and videos and playing music, the battery meter was at 52%.</p><p>Still, other foldables last longer. The Galaxy Z Fold 8 Ultra with its 5,000 mAh silicon carbon battery lasted 14:33, and the Razr Fold’s 6,000 mAh battery lasted 14:44.</p><p>The Galaxy Z Fold 8 benefits from 45W charging, up from 25W on the Fold 7. At 30 minutes the Fold 8 reached 70%, compared to 54% for the Fold 7.</p><p>Wireless charging sees a boost for the Fold 8, too, going from 15W to 20W. Unfortunately, you need to buy a case if you want to get magnets for Qi 2 charging, as they’re still not built into the phone.</p><h3 class="article-body__section" id="section-what-i-mostly-like"><span>What I Mostly Like</span></h3><h2 id="cameras-are-good-but-where-s-the-telephoto">Cameras are good, but where's the telephoto?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3289px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FubpnqgwBc2ZYYL8PnptdZ" name="Galaxy Z Fold 8 review-23" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/FubpnqgwBc2ZYYL8PnptdZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3289" height="1850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Taking photos on the Fold 8 feels pretty natural through the cover display </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Don’t get me wrong. The dual rear 50MP cameras on the Fold 8 are solid. But not having a telephoto zoom is pretty frickin’ lame for a $1,900 flagship.</p><p>On the plus side, check out the excellent dynamic range in this photo of a street in London dappled in sunlight. This close-up of a zinnia flower is vibrant and detailed and the richer colors in this shot of peppers versus the more washed-out Razr Fold.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=0a38d302-8aec-11f1-ba1b-0e6f42328d7d"></iframe><p>The 50MP ultrawide lens is a major upgrade over the 12MP Fold 7. I actually give the edge to the Fold 8 over the <a href="https://www.tomsguide.com/phones/iphones/ive-spent-one-month-with-the-iphone-17-pro-max-5-things-i-like-and-2-i-dont"><u>iPhone 17 Pro Max</u></a> in this ultrawide shot of a beach. The green trees pop a pit more, and there’s more detail in the rocks along the sand.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/i6m3A8UkGfAhhgKhjUQit-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hoYB9NWMBrGxyAfyg8VAt-1920-80.jpg" alt="iPhone 17 Pro Max" /><figcaption>iPhone 17 Pro Max<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/J6AnFUR7YkysLLqbNnfdt-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra" /><figcaption>Galaxy Z Fold 8 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/FFDak359qecvRxR8vQVau-1920-80.jpg" alt="Razr Fold" /><figcaption>Razr Fold<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Samsung also improved the Nightography on the Fold 8 for better low-light shots. And you can see the difference in these photos of a clock tower. It’s brighter and crisper. And in this image of string lights the Fold 8’s makes everything brighter and you can make out the individual bulbs easier.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/2wrLiHk9ZWEcSGxey9L9Z-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/SUcD6rpmHhu9jHCeakWVSo-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Galaxy Z Fold 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/kitekqAd3iuKFXhuN3cef-1920-80.jpg" alt="Razr Fold" /><figcaption>Razr Fold<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>What makes the Z Fold 8 Ultra an Ultra camera phone is its 200MP main camera. In this fountain shot you can make out more detail in the water bubbles and in the rocks. You just have more freedom to crop in overall.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=3f242512-8aec-11f1-ba1b-0e6f42328d7d"></iframe><p>But the biggest Z Fold 8 vs Fold 8 Ultra difference is the lack of telephoto zoom. At 4x, the Fold 8 delivers a crisper image of this Queen Anne statue in London. Check out the lines in the stonework.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=6e5ac7e6-8aec-11f1-ba1b-0e6f42328d7d"></iframe><p>But this 10x digital zoom shot of a tree stump rising from water shows the Fold 8’s limitations. The lines in the bark look blurrier compared to the 10MP Fold 8 Ultra with 3x optical. And the Razr Fold’s 50MP telephoto is even sharper.</p><p>For more, check out my <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200">Galaxy Z Fold 8 vs Fold 8 Ultra camera face-off</a>. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/skfjecoYsDxcAXKKEePmH-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/a9wbSK4tv3mPNXB8ppuze-1920-80.jpg" alt="iPhone 17 Pro Max" /><figcaption>iPhone 17 Pro Max<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bEMZu2hqsLsuUJeShFLPk-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra" /><figcaption>Galaxy Z Fold 8 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bs8w92ZUjCBxMPAA3opbs-1920-80.jpg" alt="Razr Fold" /><figcaption>Razr Fold<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>I don’t have any complaints about the selfies from the Galaxy Fold 8. The front 10MP camera. My blue shirt pops, and there’s plenty of detail in my hair and the surrounding grass. The inside 10MP produced a vivid but somewhat blurrier image.</p><p>Plus, you can always flip the display around and use the main 50MP wide camera to take selfies. The results look sharp though the shadows are more pronounced than I’d like.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/nAvTT6ssuQQNM4e6RXUqj-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Inside Camera - Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/3AbR4H4oHUbcLUSYYrbkj-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Front Camera - Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Hs4g68QEV8JhnocgjsTyY-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Main Camera - Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure></figure><h3 class="article-body__section" id="section-what-i-don-t-like"><span>What I Don't Like</span></h3><h2 id="more-apps-need-optimization-for-the-big-screen">More apps need optimization for the big screen</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xk5KeA75WpyRNUfgTjXLuY" name="Fold 8 multitasking" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/xk5KeA75WpyRNUfgTjXLuY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Two apps running side by side on the Galaxy Z Fold 8 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There’s a fair number of apps that are truly optimized for the Fold 8’s wide display. In Gmail, you can see your inbox on the left and the content of your images on the right. And in TikTok the comments will pop up on the right side of the display while the video plays on the left. Spotify looks pretty slick, too, with your playlists here and play window there.</p><p>However, some apps just feel like stretched out phone experiences. Slack should have you rooms and contacts on the left and messages on the right instead of just really wide conversation windows. Other apps that could use the dual-pane treatment include Reddit and especially X.</p><p>I get that the iPhone Ultra isn’t out yet. But you know there's going to be a better app experience right from day one. Just look at iPadOS on the iPad mini.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/YNuV6vT8MHbh6YZ4XQtbdZ-1920-80.jpg" alt="Galaxy Z Fold 8 shown held in-hand" /><figcaption>The split-screen keyboard on the Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/HLiQi7svQtipSGHmWC9sSZ-1920-80.jpg" alt="Galaxy Z Fold 8 shown held in-hand" /><figcaption>The Fold 8's cover display is roomy enough for comfortable typing.<small role="credit">Tom's Guide</small></figcaption></figure></figure><h2 id="where-is-the-dust-resistance">Where is the dust 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:3330px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tgL6AweqbNKzVVmQctz95Z" name="Galaxy Z Fold 8 review-22" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/tgL6AweqbNKzVVmQctz95Z-1920-80.jpg" mos="" align="middle" fullscreen="" width="3330" height="1873" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Don't get sand or dust in the Fold 8. It's not IP68 rated. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unfortunately, you’re stuck with the same IP48 durability rating on the Galaxy Z Fold 8. That means this device can withstand being submerged in water for 30 minutes but is not dust resistant. I’d like to see Samsung take the leap to IP68 so you can actually take foldables like this to the beach.</p><p>Other foldables like the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Google Pixel 10 Pro Fold</a> and <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Motorola Razr Fold</a> are IP68 rated.</p><p>During a roundtable discussion, a Samsung exec told us that the company is not chasing numbers but real-world scenarios. But I’d argue dust and sand are “real world.”</p><h2 id="flex-view-is-ultra-exclusive">Flex view is Ultra exclusive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FTAPbqnyMxnn72TGFVq4Eg" name="Galaxy Z Fold 8 Ultra-29" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/FTAPbqnyMxnn72TGFVq4Eg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Galaxy Z Fold 8 Ultra has Flex View but the Fold 8 does not. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Because of the way the hinge was designed, there’s no Flex Mode on the Fold 8 — that’s exclusive to the Fold 8 Ultra. So that means you can’t use the Fold 8 as a mini laptop. I missed not being able to watch YouTube videos in this mode or do quick Google Meet calls.</p><h2 id="still-no-s-pen">Still no S Pen</h2><p>The Galaxy Fold 8 one again eschews the S Pen. While I’ve never been a heavy user, there’s lot of people who would like a stylus for taking notes, editing photos and drawing, especially on such a wide canvas.</p><p>Samsung has clearly prioritized thinness and the lack of a crease over including a digitizer. Company reps have told us they are <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">open to exploring the possibility of the S Pen’s return</a>. But that will have to be another foldable.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-review-verdict"><span>Galaxy Z Fold 8 review: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2080px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bPd7ZTJvXjFWH9MbVievUY" name="Galaxy Z Fold 8 review-13" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/bPd7ZTJvXjFWH9MbVievUY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2080" height="1170" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Overall, I’m a big fan of the Galaxy Z Fold 8. It’s the foldable design I’d rather carry and use every day over any other foldable. It’s lighter and more compact than the Fold 8 Ultra, and the main display is big enough for split-screen multitasking and binge watching.</p><p>I also really appreciate that the crease is less visible and especially the anti-glare coating, as well as the strong performance and pretty solid battery life. And while I’m getting AI fatigue, features like Now Nudge just make sense on a foldable.</p><p>On the other hand, I don’t like that I have to give up a telephoto lens. And while I personally don’t mind the lack of an S Pen, there are apparently many people who do.</p><p>I <em>do care</em> about the lack of dust resistance, and that some pretty high-profile apps aren’t optimized for the big screen — when you know the iPhone Ultra will likely have an advantage on day one. </p><p>So for now the Galaxy Z Fold 8 is the foldable I want. But Samsung please give us a better zoom next time. </p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-review-wide-for-the-win</link>
                                                                            <description>
                            <![CDATA[ I tested the Galaxy Z Fold 8 and really like the compact and wide design, eye-popping Flex Titanium display and smart AI features. But the lack of telephoto zoom is a bummer. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">27Jmty7SGrhhXELtrwG3zi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/cSYCjf2mLyLiTqkn52oxZh-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 29 Jul 2026 11:46:15 +0000</pubDate>                                                                                                                                <updated>Fri, 07 Aug 2026 15:51:47 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/cSYCjf2mLyLiTqkn52oxZh-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 shown open on a stone bench]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 shown open on a stone bench]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 shown open on a stone bench]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/cSYCjf2mLyLiTqkn52oxZh-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I’ve been reviewing <a href="https://www.tomsguide.com/best-picks/best-foldable-phones"><u>foldable phones</u></a> since the very first Galaxy Z Fold, and there’s something that’s “just right” about the Galaxy Z Fold 8. It’s super light, gives you a wide front display, and the big inside screen has two distinct orientations for video watching and browsing or reading.</p><p>Other perks include a much less noticeable crease, an anti-reflective coating for the main display and handy new AI features that take full advantage of the wide canvas.</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/SMwClG9-nR0" allowfullscreen></iframe></div></div><p>But Samsung has definitely made some trade-offs, like no telephoto zoom lens. But now that I’ve been living with the Fold 8 for a few weeks, this feels like the future of foldables — and not just because Apple is reportedly making one just like this.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-review-release-date-and-price"><span>Galaxy Z Fold 8 review: Release date and price</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="F6qr2SDN3gLqxsmgpqVYsY" name="Fold 8 back 2" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/F6qr2SDN3gLqxsmgpqVYsY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Galaxy Z Fold 8 is just 7 ounces and easy to slip into a pocket. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 has a release date of August 7th and is available now.</p><p>This foldable has a starting price of $1,899/£1,699/AU$2,699 for 12GB of RAM and 256GB of storage. You’ll pay $2,099 or $200 more for the 512GB model and $2,499 for the 1TB Fold 8 with 16GB of RAM and 1TB of storage.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p><strong>RAM</strong></p></td><td  ><p><strong>United States</strong></p></td><td  ><p><strong>United Kingdom</strong></p></td><td  ><p><strong>Australia</strong></p></td></tr><tr><td class="firstcol " ><p><strong>256GB</strong></p></td><td  ><p>12GB</p></td><td  ><p>$1,899.99</p></td><td  ><p>£1,699.00</p></td><td  ><p>AU$2,699.00</p></td></tr><tr><td class="firstcol " ><p><strong>512GB</strong></p></td><td  ><p>12GB</p></td><td  ><p>$2,099.99</p></td><td  ><p>£1,869.00</p></td><td  ><p>AU$2,999.00</p></td></tr><tr><td class="firstcol " ><p><strong>1TB</strong></p></td><td  ><p>16GB</p></td><td  ><p>$2,499.99</p></td><td  ><p>£2,209.00</p></td><td  ><p>AU$3,599.00</p></td></tr></tbody></table></div><p>The Galaxy Z Fold 8 Ultra starts at a steeper $2,099, but it also gives you bigger displays, a telephoto zoom and larger battery.</p><h2 id="galaxy-z-fold-8-specs">Galaxy Z Fold 8 specs</h2><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $1,899 / £1,699 /  AU$2,699</p></td></tr><tr><td class="firstcol " ><p><strong>Release Date</strong></p></td><td  ><p>August 7</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong></p></td><td  ><p>5.5 inches </p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong></p></td><td  ><p>7.6 inches </p></td></tr><tr><td class="firstcol " ><p><strong>Chip </strong></p></td><td  ><p>Snapdragon 8 Elite </p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB, 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB, 512GB, 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP wide, 50MP Ultra wide (10x digital zoom)</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie cameras</strong></p></td><td  ><p>10MP (main), 10MP (cover)</p></td></tr><tr><td class="firstcol " ><p><strong>Battery </strong></p></td><td  ><p>4,800 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Wired/Wireless Charging</strong></p></td><td  ><p>45W, 20W</p></td></tr><tr><td class="firstcol " ><p><strong>Size open</strong></p></td><td  ><p>161.4 x 123.9 x 4.5 mm (unfolded)</p></td></tr><tr><td class="firstcol " ><p><strong>Size closed</strong></p></td><td  ><p>123.9 x 81.9 x 9.7 mm (4.88 × 3.22 × 0.38 inches)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>201 grams (7.09 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong></p></td><td  ><p>Lavender, Graphite, Cream, Pistachio (online)</p></td></tr></tbody></table></div><h3 class="article-body__section" id="section-what-i-like"><span>What I Like</span></h3><h2 id="the-passport-like-design">The passport-like design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2380px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="mvgDxNKt4bSCeKgLQJrseY" name="Galaxy Z Fold 8 review-5" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/mvgDxNKt4bSCeKgLQJrseY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2380" height="1339" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The 5.5-inch cover display is short but wide enough to run apps comfortably. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Z Fold 8 is about the same size as a passport, which makes it really easy to slip into a front pocket. And at 201 grams (7.1 ounces), this is the lightest book-style foldable in the world.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3540px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="xWJMf4qbWeA7HP2ocEhjbZ" name="Galaxy Z Fold 8 review-7" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xWJMf4qbWeA7HP2ocEhjbZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3540" height="1991" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The front screen is tailor-made for TikTok scrolling. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I really like the 10:16 front display for scrolling through TikTok videos, and there’s plenty of room for typing with two hands. Reaching across the display with one hand can be a stretch, but overall using the Fold 8 just feels right compared to the taller Fold 8 Ultra.</p><p>Plus, opening the display is a lot easier versus the Galaxy Z Fold 7 and the Fold 8 unfolds almost perfectly flat. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2693px;"><p class="vanilla-image-block" style="padding-top:56.26%;"><img id="xsfHUrdQAp5k99yND4fgSY" name="Galaxy Z Fold 8 review-26" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/xsfHUrdQAp5k99yND4fgSY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2693" height="1515" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Thanks to Flex Titanium tech, the Galaxy Fold 8 is flat when unfolded. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>As for colors, the Fold 8 comes in Lavender, Graphite and Cream, and there’s a Pistachio option online only. I prefer the Lavender hue on our review unit because it has more personality.</p><h2 id="the-display-is-awesome-especially-anti-glare-coating">The display is awesome (especially anti-glare coating)</h2><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.26%;"><img id="Yi3SX3rGdTkh5HdALu76vY" name="Galaxy Z Fold 8 review-LIST2" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/Yi3SX3rGdTkh5HdALu76vY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2188" height="1231" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The anti-reflective 7.6-inch screen cuts down on glare outdoors.  </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>If the crease on foldable phones has always bugged you, the Galaxy Z Fold 8’s main 7.6-inch display will make you happy. Thanks to Flex Titanium tech, the crease is much less visible than before.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2274px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="PP6Mk9VYuCweU6oJKijdcZ" name="Galaxy Z Fold 8 review-17" alt="Galaxy Z Fold 8 (right)" src="https://cdn.mos.cms.futurecdn.net/PP6Mk9VYuCweU6oJKijdcZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2274" height="1279" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Fold 8 has smaller black bars but the viewing area is the same as Fold 8 Ultra. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung paired a titanium alloy film with a titanium base plate with micro-perforations that allow the display stack to adhere flush to the plate with virtually no air gaps. The result is a crease you can still feel but almost disappears when you’re viewing content. </p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@mspoonyg/video/7666429528071294222" data-video-id="7666429528071294222" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@mspoonyg" href="https://www.tiktok.com/@mspoonyg">@mspoonyg</a>                            <p></p><a target="_blank" title="♬ Thank You for Sunshine - House Duduk Music" href="https://www.tiktok.com/music/Thank-You-for-Sunshine-7650727836295612417">♬ Thank You for Sunshine - House Duduk Music</a></section>                    </blockquote></div>                <p>The bigger deal for me is the anti-reflective coating. It drastically cuts down on glare when viewing the Fold 8 outside. Check out the difference between the new Fold and the Fold 7.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XviVgfrucnRziFPJAYgcpA" name="Fold 8 display spider-man" alt="Galaxy Z Fold 8 Spider Man Brand New Day trailer" src="https://cdn.mos.cms.futurecdn.net/XviVgfrucnRziFPJAYgcpA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The main 7.6-inch display has a 4:3 aspect ratio when you open it up. The benefit here is that you get smaller black bars above and below the display when watching videos versus the more square 8-inch Fold 8 Ultra.</p><p>The viewing area itself is not larger, but I found watching the Red Hot Chili Peppers documentary on Netflix pretty immersive, as well as the “Avengers: Doomsday” trailer.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="rN8FsPNnJYUuecJ9J2oHpA" name="Fold 8 display 3.4" alt="Galaxy Z Fold 8 3:4 display for reading" src="https://cdn.mos.cms.futurecdn.net/rN8FsPNnJYUuecJ9J2oHpA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>When you flip the Fold 8 around into portrait mode with the main display open, you get a 3:4 aspect ratio. This gives you more real estate vertically, making it the better option for surfing the web and reading ebooks.</p><h2 id="helpful-ai-features-2">Helpful AI 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="aU3ngqVpjk6ewWQungWboA" name="Fold 8 Now Nudge" alt="Galaxy Z Fold 8 Now Nudge AI feature" src="https://cdn.mos.cms.futurecdn.net/aU3ngqVpjk6ewWQungWboA-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Now Nudge will suggest apps to open in multi-window mode. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Samsung Galaxy Z Fold 8 has some AI features that I really like.</p><p>My favorite is Now Nudge, which prompts you to open a related app in Split View without having to leave the app you’re currently using.</p><p>For example, I received a text message asking if I was free for dinner next Friday at 7 p.m. A little calendar icon appeared, and when I tapped that I opened the Calendar app in split screen mode. That’s pretty handy.</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/6m04UbLVC9E" allowfullscreen></iframe></div></div><p>Another super useful AI feature is My FanCam. When editing a video with multiple people in the frame, you can select the subject you want, and the Fold 8 will crop in and “follow” that person throughout the clip.</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/aFwm3S3JDE0" allowfullscreen></iframe></div></div><p>You can even choose the aspect ratio. This is great for sports parents, concert lovers and more, though it only works on humans — and only one at a time.</p><h2 id="very-snappy-performance">Very snappy performance</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3508px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="CnV2R6YCsPFej5e7GpiWfZ" name="Galaxy Z Fold 8 review-24" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/CnV2R6YCsPFej5e7GpiWfZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3508" height="1973" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Fold 8 is a blast for playing games on the go. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p><br>Powered by a Snapdragon 8 Elite Gen 5 for Galaxy chip, the Galaxy Z Fold 8 offers flagship-level performance on par with the Galaxy S26 Ultra. I mowed down several enemies in Call of Duty Mobile and raced around tracks in Asphalt 8 without seeing any slowdowns.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Geekbench (Single/Multicore)</strong></p></td><td  ><p><strong>3DMark Solar Bay Unlimited</strong></p></td><td  ><p><strong>Geekbench AI </strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>3,659/11,020</p></td><td  ><p>47.35/12,454</p></td><td  ><p>72242</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold </strong></p></td><td  ><p>2.711/9,134</p></td><td  ><p>35.12/9,413</p></td><td  ><p>59663</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>3,052/9,735</p></td><td  ><p>41.21/10,812</p></td><td  ><p>61,299</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>3,785 / 11,563</p></td><td  ><p>49.37 / 12,984</p></td><td  ><p>83047 (TensorFlow Lite QNN)</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>3,871 / 9,968</p></td><td  ><p>46.6 / 12,260</p></td><td  ><p>48549 (Quantitized Score ML/Neural Engine)</p></td></tr></tbody></table></div><p>The Fold 8 is also a multitasking champ. I could run up to three apps on screen at once without any noticeable lag. For example, I scrolled through my inbox in Gmail while playing 311 Radio on Spotify and skimming through and zooming in on my photos in the Gallery app.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2879px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="77ZTA3cHAT3JoQVSNWAUNW" name="Galaxy Z Fold 8-15" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/77ZTA3cHAT3JoQVSNWAUNW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2879" height="1619" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Galaxy Z Fold 8 can run three apps at once. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The Galaxy Z Fold 8 performed very well on our lab tests, too. It beats the iPhone 17 Pro Max on multi-core performance in Geekbench and in the 3DMark graphics benchmark.</p><h2 id="solid-battery-life-faster-charging">Solid battery life, faster charging</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="2RjVPjGpSRDgg7JtX5ooKg" name="Fold 8 back" alt="Galaxy Z Fold 8 back side" src="https://cdn.mos.cms.futurecdn.net/2RjVPjGpSRDgg7JtX5ooKg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Galaxy Z Fold 8 is one of the first Samsung phones to offer a silicon carbon battery, which allows for more capacity without adding thickness to the phone. The Fold 8 has a 4,800 mAh battery, compared to just a 4,400 mAh Li-ion battery on the previous Fold 7.</p><div ><table><tbody><tr><td class="firstcol " ><p><strong></strong></p></td><td  ><p><strong>Hours : Minutes</strong></p></td><td  ><p><strong>Charging % in 30 minutes</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>12:19</p></td><td  ><p>70%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>14:33</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy 7 Fold 7</strong></p></td><td  ><p>10:44</p></td><td  ><p>54%</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>14:44</p></td><td  ><p>73%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy S26 Ultra</strong></p></td><td  ><p>16:10</p></td><td  ><p>77%</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>17:54</p></td><td  ><p>64%</p></td></tr></tbody></table></div><p>On the Tom’s Guide battery test, which consists of web surfing over 5G, the Fold 8 lasted a pretty good 12 hours and 19 minutes. That beats the Fold 7 by nearly 1.5 hours, though the Fold 8 isn’t good enough to make our <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html"><u>best phone battery life</u></a> list.</p><p>In my time with the phone I enjoyed fairly strong endurance. For example, after a day of mixed usage, including checking email, capturing photos and videos and playing music, the battery meter was at 52%.</p><p>Still, other foldables last longer. The Galaxy Z Fold 8 Ultra with its 5,000 mAh silicon carbon battery lasted 14:33, and the Razr Fold’s 6,000 mAh battery lasted 14:44.</p><p>The Galaxy Z Fold 8 benefits from 45W charging, up from 25W on the Fold 7. At 30 minutes the Fold 8 reached 70%, compared to 54% for the Fold 7.</p><p>Wireless charging sees a boost for the Fold 8, too, going from 15W to 20W. Unfortunately, you need to buy a case if you want to get magnets for Qi 2 charging, as they’re still not built into the phone.</p><h3 class="article-body__section" id="section-what-i-mostly-like"><span>What I Mostly Like</span></h3><h2 id="cameras-are-good-but-where-s-the-telephoto">Cameras are good, but where's the telephoto?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3289px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FubpnqgwBc2ZYYL8PnptdZ" name="Galaxy Z Fold 8 review-23" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/FubpnqgwBc2ZYYL8PnptdZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="3289" height="1850" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Taking photos on the Fold 8 feels pretty natural through the cover display </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Don’t get me wrong. The dual rear 50MP cameras on the Fold 8 are solid. But not having a telephoto zoom is pretty frickin’ lame for a $1,900 flagship.</p><p>On the plus side, check out the excellent dynamic range in this photo of a street in London dappled in sunlight. This close-up of a zinnia flower is vibrant and detailed and the richer colors in this shot of peppers versus the more washed-out Razr Fold.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=0a38d302-8aec-11f1-ba1b-0e6f42328d7d"></iframe><p>The 50MP ultrawide lens is a major upgrade over the 12MP Fold 7. I actually give the edge to the Fold 8 over the <a href="https://www.tomsguide.com/phones/iphones/ive-spent-one-month-with-the-iphone-17-pro-max-5-things-i-like-and-2-i-dont"><u>iPhone 17 Pro Max</u></a> in this ultrawide shot of a beach. The green trees pop a pit more, and there’s more detail in the rocks along the sand.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/i6m3A8UkGfAhhgKhjUQit-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/hoYB9NWMBrGxyAfyg8VAt-1920-80.jpg" alt="iPhone 17 Pro Max" /><figcaption>iPhone 17 Pro Max<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/J6AnFUR7YkysLLqbNnfdt-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra" /><figcaption>Galaxy Z Fold 8 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/FFDak359qecvRxR8vQVau-1920-80.jpg" alt="Razr Fold" /><figcaption>Razr Fold<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Samsung also improved the Nightography on the Fold 8 for better low-light shots. And you can see the difference in these photos of a clock tower. It’s brighter and crisper. And in this image of string lights the Fold 8’s makes everything brighter and you can make out the individual bulbs easier.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/2wrLiHk9ZWEcSGxey9L9Z-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/SUcD6rpmHhu9jHCeakWVSo-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Galaxy Z Fold 7<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/kitekqAd3iuKFXhuN3cef-1920-80.jpg" alt="Razr Fold" /><figcaption>Razr Fold<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>What makes the Z Fold 8 Ultra an Ultra camera phone is its 200MP main camera. In this fountain shot you can make out more detail in the water bubbles and in the rocks. You just have more freedom to crop in overall.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=3f242512-8aec-11f1-ba1b-0e6f42328d7d"></iframe><p>But the biggest Z Fold 8 vs Fold 8 Ultra difference is the lack of telephoto zoom. At 4x, the Fold 8 delivers a crisper image of this Queen Anne statue in London. Check out the lines in the stonework.</p><iframe allow="" height="400" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://cdn.knightlab.com/libs/juxtapose/latest/embed/index.html?uid=6e5ac7e6-8aec-11f1-ba1b-0e6f42328d7d"></iframe><p>But this 10x digital zoom shot of a tree stump rising from water shows the Fold 8’s limitations. The lines in the bark look blurrier compared to the 10MP Fold 8 Ultra with 3x optical. And the Razr Fold’s 50MP telephoto is even sharper.</p><p>For more, check out my <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-camera-test-is-the-telephoto-zoom-worth-the-extra-usd200">Galaxy Z Fold 8 vs Fold 8 Ultra camera face-off</a>. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/skfjecoYsDxcAXKKEePmH-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/a9wbSK4tv3mPNXB8ppuze-1920-80.jpg" alt="iPhone 17 Pro Max" /><figcaption>iPhone 17 Pro Max<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bEMZu2hqsLsuUJeShFLPk-1920-80.jpg" alt="Galaxy Z Fold 8 Ultra" /><figcaption>Galaxy Z Fold 8 Ultra<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/bs8w92ZUjCBxMPAA3opbs-1920-80.jpg" alt="Razr Fold" /><figcaption>Razr Fold<small role="credit">Tom's Guide</small></figcaption></figure></figure><p>I don’t have any complaints about the selfies from the Galaxy Fold 8. The front 10MP camera. My blue shirt pops, and there’s plenty of detail in my hair and the surrounding grass. The inside 10MP produced a vivid but somewhat blurrier image.</p><p>Plus, you can always flip the display around and use the main 50MP wide camera to take selfies. The results look sharp though the shadows are more pronounced than I’d like.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/nAvTT6ssuQQNM4e6RXUqj-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Inside Camera - Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/3AbR4H4oHUbcLUSYYrbkj-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Front Camera - Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Hs4g68QEV8JhnocgjsTyY-1920-80.jpg" alt="Galaxy Z Fold 8" /><figcaption>Main Camera - Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure></figure><h3 class="article-body__section" id="section-what-i-don-t-like"><span>What I Don't Like</span></h3><h2 id="more-apps-need-optimization-for-the-big-screen">More apps need optimization for the big screen</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xk5KeA75WpyRNUfgTjXLuY" name="Fold 8 multitasking" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/xk5KeA75WpyRNUfgTjXLuY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Two apps running side by side on the Galaxy Z Fold 8 </span><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>There’s a fair number of apps that are truly optimized for the Fold 8’s wide display. In Gmail, you can see your inbox on the left and the content of your images on the right. And in TikTok the comments will pop up on the right side of the display while the video plays on the left. Spotify looks pretty slick, too, with your playlists here and play window there.</p><p>However, some apps just feel like stretched out phone experiences. Slack should have you rooms and contacts on the left and messages on the right instead of just really wide conversation windows. Other apps that could use the dual-pane treatment include Reddit and especially X.</p><p>I get that the iPhone Ultra isn’t out yet. But you know there's going to be a better app experience right from day one. Just look at iPadOS on the iPad mini.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/YNuV6vT8MHbh6YZ4XQtbdZ-1920-80.jpg" alt="Galaxy Z Fold 8 shown held in-hand" /><figcaption>The split-screen keyboard on the Galaxy Z Fold 8<small role="credit">Tom's Guide</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/HLiQi7svQtipSGHmWC9sSZ-1920-80.jpg" alt="Galaxy Z Fold 8 shown held in-hand" /><figcaption>The Fold 8's cover display is roomy enough for comfortable typing.<small role="credit">Tom's Guide</small></figcaption></figure></figure><h2 id="where-is-the-dust-resistance">Where is the dust 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:3330px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="tgL6AweqbNKzVVmQctz95Z" name="Galaxy Z Fold 8 review-22" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/tgL6AweqbNKzVVmQctz95Z-1920-80.jpg" mos="" align="middle" fullscreen="" width="3330" height="1873" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">Don't get sand or dust in the Fold 8. It's not IP68 rated. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Unfortunately, you’re stuck with the same IP48 durability rating on the Galaxy Z Fold 8. That means this device can withstand being submerged in water for 30 minutes but is not dust resistant. I’d like to see Samsung take the leap to IP68 so you can actually take foldables like this to the beach.</p><p>Other foldables like the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Google Pixel 10 Pro Fold</a> and <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Motorola Razr Fold</a> are IP68 rated.</p><p>During a roundtable discussion, a Samsung exec told us that the company is not chasing numbers but real-world scenarios. But I’d argue dust and sand are “real world.”</p><h2 id="flex-view-is-ultra-exclusive">Flex view is Ultra exclusive</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="FTAPbqnyMxnn72TGFVq4Eg" name="Galaxy Z Fold 8 Ultra-29" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/FTAPbqnyMxnn72TGFVq4Eg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="caption-text">The Galaxy Z Fold 8 Ultra has Flex View but the Fold 8 does not. </span><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Because of the way the hinge was designed, there’s no Flex Mode on the Fold 8 — that’s exclusive to the Fold 8 Ultra. So that means you can’t use the Fold 8 as a mini laptop. I missed not being able to watch YouTube videos in this mode or do quick Google Meet calls.</p><h2 id="still-no-s-pen">Still no S Pen</h2><p>The Galaxy Fold 8 one again eschews the S Pen. While I’ve never been a heavy user, there’s lot of people who would like a stylus for taking notes, editing photos and drawing, especially on such a wide canvas.</p><p>Samsung has clearly prioritized thinness and the lack of a crease over including a digitizer. Company reps have told us they are <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">open to exploring the possibility of the S Pen’s return</a>. But that will have to be another foldable.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-review-verdict"><span>Galaxy Z Fold 8 review: Verdict</span></h3><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2080px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bPd7ZTJvXjFWH9MbVievUY" name="Galaxy Z Fold 8 review-13" alt="Galaxy Z Fold 8 shown held in-hand" src="https://cdn.mos.cms.futurecdn.net/bPd7ZTJvXjFWH9MbVievUY-1920-80.jpg" mos="" align="middle" fullscreen="" width="2080" height="1170" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Overall, I’m a big fan of the Galaxy Z Fold 8. It’s the foldable design I’d rather carry and use every day over any other foldable. It’s lighter and more compact than the Fold 8 Ultra, and the main display is big enough for split-screen multitasking and binge watching.</p><p>I also really appreciate that the crease is less visible and especially the anti-glare coating, as well as the strong performance and pretty solid battery life. And while I’m getting AI fatigue, features like Now Nudge just make sense on a foldable.</p><p>On the other hand, I don’t like that I have to give up a telephoto lens. And while I personally don’t mind the lack of an S Pen, there are apparently many people who do.</p><p>I <em>do care</em> about the lack of dust resistance, and that some pretty high-profile apps aren’t optimized for the big screen — when you know the iPhone Ultra will likely have an advantage on day one. </p><p>So for now the Galaxy Z Fold 8 is the foldable I want. But Samsung please give us a better zoom next time. </p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I took the Galaxy Z Fold 8 Ultra vs Fold 7 outside — and the difference is so drastic people think I faked the results ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I don't post to TikTok very often, but I was so floored by what I saw when testing the Galaxy Z Fold 8 Ultra outside I had to post something.</p><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> (and regular <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a>) both have an anti-reflective coating on their main displays. That means there's less glare on the screen when you're outdoors compared to the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a>. A lot less.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@mspoonyg/video/7666429528071294222" data-video-id="7666429528071294222" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@mspoonyg" href="https://www.tiktok.com/@mspoonyg">@mspoonyg</a>                            <p></p><a target="_blank" title="♬ Thank You for Sunshine - House Duduk Music" href="https://www.tiktok.com/music/Thank-You-for-Sunshine-7650727836295612417">♬ Thank You for Sunshine - House Duduk Music</a></section>                    </blockquote></div>                <p>As you can see in the above clip, the Galaxy Z Fold 8 maintains wide viewing angles and doesn't suffer from nearly as many reflections as the Fold 7 when showing a photo of a magenta zinnia flower.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMqvAe"></div>                            </div>                            <script src="https://kwizly.com/embed/eMqvAe.js" async></script><p>This makes a huge difference in everyday utility when you're trying to use your foldable phone outside.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LEGFFw868pqvvTLe5fDgAZ" name="fold 8 ultra vs fold 7 displays" alt="Galaxy Z Fold 8 Ultra display vs Fold 7 close-up showing the crease on Fold 7" src="https://cdn.mos.cms.futurecdn.net/LEGFFw868pqvvTLe5fDgAZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>You'll also notice that the crease on the Fold 7 is a lot more prominent. The Fold 8 Ultra employs new Flex Titanium technology to minimize the crease. It's definitely still there, but a lot more subtle.</p><div class="product"><a data-dimension112="06db6f0a-89ff-11f1-bbf7-1d407ef1397a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="06db6f0a-89ff-11f1-bbf7-1d407ef1397a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,900 off w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get up to $1,900 off the Galaxy Z Fold 8 Ultra with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="06db6f0a-89ff-11f1-bbf7-1d407ef1397a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Brightness</strong><br><strong>(Nits, HDR)</strong></p></td><td  ><p><strong>Color</strong><br><strong>(DCI-P3)</strong></p></td><td  ><p><strong>Accuracy</strong><br><strong>(Delta-E)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>2,649</p></td><td  ><p>82%/95.4% (Natural/Vivid)</p></td><td  ><p>0.21/0.25 (Natural/Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>2,687</p></td><td  ><p>82.6%/95.3% (Natural/Vivid)</p></td><td  ><p>0.2/0.27 (Natural/Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>2,310</p></td><td  ><p>96%/105.2% (Natural/Vivid)</p></td><td  ><p>0.22/0.28 (Natural/Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold </strong></p></td><td  ><p>1,233</p></td><td  ><p>88.5%/159.6% (Natural/Vivid)</p></td><td  ><p>0.2/0.35<br>(Natural/Vivid)</p></td></tr></tbody></table></div><p>It also helps that the Galaxy Z Fold 8 Ultra's display is brighter than the Fold 7. In our lab tests, the Fold 8 Ultra's 8-inch display reached 2,687 nits of brightness. That's a pretty big jump from the 2,310 nits we measured on the Fold 7.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wHB8qpYiB96GnfKYVQusW3" name="fold 8 ultra vs fold 7 sun" alt="Galaxy Z Fold 8 Ultra vs Fold 7 in direct sunlight" src="https://cdn.mos.cms.futurecdn.net/wHB8qpYiB96GnfKYVQusW3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>To be clear, neither display is perfect in super strong direct sunlight. But you can see in this photo, the Fold 8 Ultra's screen indeed looks brighter and the crease is still way less prominent. </p><p>I've gotten a ton of comments on my TikTok video, some claiming that the test is rigged. I did use each phone to take the same exact photo of the same flower seconds apart, then displayed them at full screen and maximum brightness. </p><p>To be more scientific, I should have used the same exact image, but I don't think the results would have been materially different.</p><p>Is this enough of a leap to justify upgrading from a Galaxy Z Fold 7 to a Fold 8 or Fold 8 Ultra? Not really. But the anti-reflective coating is super impressive — and will certainly make Fold 7 owners jealous.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview"><strong>Samsung exec weighs in on iPhone Ultra threat</strong></a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones"><strong>Galaxy Z Fold 8 preorder deals: here's how I'm saving up to $1,200 on Samsung's new phones</strong></a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/my-first-36-hours-with-the-samsung-galaxy-z-fold-8-i-was-wrong-about-the-passport-screen-but-that-usd1-899-price-still-stings"><strong>My first 36 hours with the Samsung Galaxy Z Fold 8: I was wrong</strong></a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-took-the-galaxy-z-fold-8-ultra-and-fold-7-outside-and-the-difference-is-astonishing</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Z Fold 8's main display isn't just brighter to make outdoor viewing a breeze, but there's significantly less glare too. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">gUy3yyHsdRNHjYAtu7LYYe</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/C8EuTanEP7wbQzDjYxgRUZ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Tue, 28 Jul 2026 05:15:00 +0000</pubDate>                                                                                                                                <updated>Thu, 30 Jul 2026 14:04:58 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/C8EuTanEP7wbQzDjYxgRUZ-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 Ultra next to Fold 7 outside]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 Ultra next to Fold 7 outside]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 Ultra next to Fold 7 outside]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/C8EuTanEP7wbQzDjYxgRUZ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I don't post to TikTok very often, but I was so floored by what I saw when testing the Galaxy Z Fold 8 Ultra outside I had to post something.</p><p>The <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> (and regular <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a>) both have an anti-reflective coating on their main displays. That means there's less glare on the screen when you're outdoors compared to the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a>. A lot less.</p>                    <div class= "tiktok-wrapper" style="min-height: 750px;"><blockquote class="tiktok-embed" cite="https://www.tiktok.com/@mspoonyg/video/7666429528071294222" data-video-id="7666429528071294222" style="max-width: 605px; min-width: 325px;">                        <section>                            <a target="_blank" title="@mspoonyg" href="https://www.tiktok.com/@mspoonyg">@mspoonyg</a>                            <p></p><a target="_blank" title="♬ Thank You for Sunshine - House Duduk Music" href="https://www.tiktok.com/music/Thank-You-for-Sunshine-7650727836295612417">♬ Thank You for Sunshine - House Duduk Music</a></section>                    </blockquote></div>                <p>As you can see in the above clip, the Galaxy Z Fold 8 maintains wide viewing angles and doesn't suffer from nearly as many reflections as the Fold 7 when showing a photo of a magenta zinnia flower.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-eMqvAe"></div>                            </div>                            <script src="https://kwizly.com/embed/eMqvAe.js" async></script><p>This makes a huge difference in everyday utility when you're trying to use your foldable phone outside.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LEGFFw868pqvvTLe5fDgAZ" name="fold 8 ultra vs fold 7 displays" alt="Galaxy Z Fold 8 Ultra display vs Fold 7 close-up showing the crease on Fold 7" src="https://cdn.mos.cms.futurecdn.net/LEGFFw868pqvvTLe5fDgAZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>You'll also notice that the crease on the Fold 7 is a lot more prominent. The Fold 8 Ultra employs new Flex Titanium technology to minimize the crease. It's definitely still there, but a lot more subtle.</p><div class="product"><a data-dimension112="06db6f0a-89ff-11f1-bbf7-1d407ef1397a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="06db6f0a-89ff-11f1-bbf7-1d407ef1397a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,900 off w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get up to $1,900 off the Galaxy Z Fold 8 Ultra with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="06db6f0a-89ff-11f1-bbf7-1d407ef1397a" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Brightness</strong><br><strong>(Nits, HDR)</strong></p></td><td  ><p><strong>Color</strong><br><strong>(DCI-P3)</strong></p></td><td  ><p><strong>Accuracy</strong><br><strong>(Delta-E)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>2,649</p></td><td  ><p>82%/95.4% (Natural/Vivid)</p></td><td  ><p>0.21/0.25 (Natural/Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>2,687</p></td><td  ><p>82.6%/95.3% (Natural/Vivid)</p></td><td  ><p>0.2/0.27 (Natural/Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>2,310</p></td><td  ><p>96%/105.2% (Natural/Vivid)</p></td><td  ><p>0.22/0.28 (Natural/Vivid)</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold </strong></p></td><td  ><p>1,233</p></td><td  ><p>88.5%/159.6% (Natural/Vivid)</p></td><td  ><p>0.2/0.35<br>(Natural/Vivid)</p></td></tr></tbody></table></div><p>It also helps that the Galaxy Z Fold 8 Ultra's display is brighter than the Fold 7. In our lab tests, the Fold 8 Ultra's 8-inch display reached 2,687 nits of brightness. That's a pretty big jump from the 2,310 nits we measured on the Fold 7.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="wHB8qpYiB96GnfKYVQusW3" name="fold 8 ultra vs fold 7 sun" alt="Galaxy Z Fold 8 Ultra vs Fold 7 in direct sunlight" src="https://cdn.mos.cms.futurecdn.net/wHB8qpYiB96GnfKYVQusW3-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>To be clear, neither display is perfect in super strong direct sunlight. But you can see in this photo, the Fold 8 Ultra's screen indeed looks brighter and the crease is still way less prominent. </p><p>I've gotten a ton of comments on my TikTok video, some claiming that the test is rigged. I did use each phone to take the same exact photo of the same flower seconds apart, then displayed them at full screen and maximum brightness. </p><p>To be more scientific, I should have used the same exact image, but I don't think the results would have been materially different.</p><p>Is this enough of a leap to justify upgrading from a Galaxy Z Fold 7 to a Fold 8 or Fold 8 Ultra? Not really. But the anti-reflective coating is super impressive — and will certainly make Fold 7 owners jealous.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview"><strong>Samsung exec weighs in on iPhone Ultra threat</strong></a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones"><strong>Galaxy Z Fold 8 preorder deals: here's how I'm saving up to $1,200 on Samsung's new phones</strong></a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/my-first-36-hours-with-the-samsung-galaxy-z-fold-8-i-was-wrong-about-the-passport-screen-but-that-usd1-899-price-still-stings"><strong>My first 36 hours with the Samsung Galaxy Z Fold 8: I was wrong</strong></a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Verizon is knocking up to $1,200 off Galaxy Z Fold 8 preorders: how to get yours ]]></title>
                                                                                                <dc:content><![CDATA[ <p>We're still days away from the official release of Samsung's new foldable phones, but if you want to get your preorder on, one carrier is offering an epic deal you can't miss. </p><p>For a limited time, <a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow">Verizon is taking up to $1,200 off Galaxy Z Fold 8 preorders</a> or <a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?sku=sku6049270?isMyPlanFlow=true" target="_blank" rel="nofollow">up to $1,200 off Galaxy Z Fold 8 Ultra preorders</a>. Both offers require a trade-in and eligible data plan. Nevertheless, they're an excellent way to shave a few hundred dollars off Samsung's new phones. </p><p>For more personal recommendations, make sure to check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> homepage and our <a href="https://www.tomsguide.com/news/ultimate-back-to-school-guide">back to school deals</a> guide. Also make sure to bookmark our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Galaxy Z Fold 8 preorder deals</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/best-galaxy-z-flip-8-deals-get-samsungs-new-foldable-for-free">Galaxy Z Flip 8 preorder deals</a> for the latest discounts.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><div class="product"><a data-dimension112="23f2c0be-8a01-11f1-b1a9-4d464d99c996" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="23f2c0be-8a01-11f1-b1a9-4d464d99c996" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25=""><strong>up to $1,200 off w/ trade-in + unlimited @ Verizon</strong></a><br>Verizon is taking up to $1,200 off the Galaxy Z Fold 8 with trade-in and select data plans. The phone features a 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8 hands-on</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but multitasking is way more suitable on its canvas, with up to four apps running simultaneously.<a class="view-deal button" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="23f2c0be-8a01-11f1-b1a9-4d464d99c996" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="23f2c136-8a01-11f1-a81c-1dca9152d175" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?sku=sku6049270?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?sku=sku6049270?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="23f2c136-8a01-11f1-a81c-1dca9152d175" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25=""><strong>up to $1,200 off w/ trade-in + unlimited @ Verizon</strong></a><br>Verizon is taking up to $1,200 off the Galaxy Z Fold 8 Ultra with trade-in and select data plans. The phone features an 8-inch AMOLED (2504 x 2256) 120Hz main display, 6.5-inch AMOLED (1080 x 2520) 120Hz cover display, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. On the rear you get a 200MP main wide-angle lens, 50MP ultra-wide lens, and 10MP telephoto lens (3x optical). Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra hands-on</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?sku=sku6049270?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="23f2c136-8a01-11f1-a81c-1dca9152d175" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25="">View Deal</a></p></div><p>One of the biggest differences between the Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra comes to down to display size. The Galaxy Z Fold 8 has a wider design that gives it an aspect ratio similar to an iPad mini, making it more suitable for watching videos.</p><p>It also steals the most unique features of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-trifold-review">Galaxy Z TriFold</a>: its three-app side-by-side multitasking. While the more expensive <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> can run up to four apps simultaneously, the Z Fold 8 has the inherent advantage because of how it lays them out. It can run three apps in their own windows, all at the same time — which it can do thanks to its 7.6-inch main display. What's great about this layout is that all three windows remain proportionate, with the ability to save them as an app pair shortcut for quick access later. And if you need just one more app, you can launch a fourth in a separate floating window.</p><p>Meanwhile, the Galaxy Z Fold 8 Ultra has a more square aspect ratio when opened. We tried running three apps on the Galaxy Z Fold 8 Ultra's 8-inch main display, but it would only let you run two properly. Sure, you can introduce a third app, but it forces the layout to change so that one app remains in full view on one side, while the other two share the remaining half. This isn’t ideal because those two apps get shrunken down to the point where they're almost unusable.</p><p>Bottom line: If you're looking to multitask Galaxy Z Fold 8 is the winner. </p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Z Fold 8</p></th><th  ><p>Samsung Galaxy Z Fold 8 Ultra</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $1,899 / £1,699</p></td><td  ><p>From $2,099 / £1,899</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong></p></td><td  ><p>7.6 inches AMOLED (1848 x 2448, 1-120Hz)</p></td><td  ><p>8 inches AMOLED (2504 x 2256, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong></p></td><td  ><p>5.5 inches AMOLED (1248 x 1972, 1-120Hz) </p></td><td  ><p>6.5 inches AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB / 16GB</p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB/512GB/1TB</p></td><td  ><p>256GB/512GB/1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP wide, 50MP Ultra wide (10x digital zoom)</p></td><td  ><p>200MP wide, 50MP ultra-wide, 10MP telephoto (3x optical)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover camera</strong></p></td><td  ><p>10MP</p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Main display camera</strong></p></td><td  ><p>10MP (f/2.2)</p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired / 20W wireless</p></td><td  ><p>45W wired / 20W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,800 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>123.9 x 81.9 x 9.7 mm (folded), 161.4 x 123.9 x 4.5 mm (unfolded)</p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.16 inches) unfolded</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>201 grams (7 ounces)</p></td><td  ><p>215 grams (7.5 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP48</p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong> </p></td><td  ><p>Lavender, Graphite, Cream, Pistachio (online)</p></td><td  ><p>Violet shadow, Cream, Graphite, Violet Green (online exclusive)</p></td></tr></tbody></table></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/verizon-is-knocking-up-to-usd1-200-off-galaxy-z-fold-8-preorders-how-to-get-yours</link>
                                                                            <description>
                            <![CDATA[ Verizon is knocking up to $1,200 off Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra preorders. Here's how you can save big on Samsung's newest foldables. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">rLBQSzSbnrz4PeYcBgHdQ8</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/JFBEU989UXH8gTTU2HryEL-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 27 Jul 2026 21:32:05 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5-320-70.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks&amp;nbsp;against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more.&amp;nbsp;He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/JFBEU989UXH8gTTU2HryEL-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 held in front of a wall with graffiti]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 held in front of a wall with graffiti]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 held in front of a wall with graffiti]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/JFBEU989UXH8gTTU2HryEL-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>We're still days away from the official release of Samsung's new foldable phones, but if you want to get your preorder on, one carrier is offering an epic deal you can't miss. </p><p>For a limited time, <a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow">Verizon is taking up to $1,200 off Galaxy Z Fold 8 preorders</a> or <a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?sku=sku6049270?isMyPlanFlow=true" target="_blank" rel="nofollow">up to $1,200 off Galaxy Z Fold 8 Ultra preorders</a>. Both offers require a trade-in and eligible data plan. Nevertheless, they're an excellent way to shave a few hundred dollars off Samsung's new phones. </p><p>For more personal recommendations, make sure to check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> homepage and our <a href="https://www.tomsguide.com/news/ultimate-back-to-school-guide">back to school deals</a> guide. Also make sure to bookmark our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Galaxy Z Fold 8 preorder deals</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/best-galaxy-z-flip-8-deals-get-samsungs-new-foldable-for-free">Galaxy Z Flip 8 preorder deals</a> for the latest discounts.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><div class="product"><a data-dimension112="23f2c0be-8a01-11f1-b1a9-4d464d99c996" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="23f2c0be-8a01-11f1-b1a9-4d464d99c996" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25=""><strong>up to $1,200 off w/ trade-in + unlimited @ Verizon</strong></a><br>Verizon is taking up to $1,200 off the Galaxy Z Fold 8 with trade-in and select data plans. The phone features a 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8 hands-on</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but multitasking is way more suitable on its canvas, with up to four apps running simultaneously.<a class="view-deal button" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8/?sku=sku6049305?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="23f2c0be-8a01-11f1-b1a9-4d464d99c996" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="23f2c136-8a01-11f1-a81c-1dca9152d175" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?sku=sku6049270?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?sku=sku6049270?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="23f2c136-8a01-11f1-a81c-1dca9152d175" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25=""><strong>up to $1,200 off w/ trade-in + unlimited @ Verizon</strong></a><br>Verizon is taking up to $1,200 off the Galaxy Z Fold 8 Ultra with trade-in and select data plans. The phone features an 8-inch AMOLED (2504 x 2256) 120Hz main display, 6.5-inch AMOLED (1080 x 2520) 120Hz cover display, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. On the rear you get a 200MP main wide-angle lens, 50MP ultra-wide lens, and 10MP telephoto lens (3x optical). Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra hands-on</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://www.verizon.com/smartphones/samsung-galaxy-z-fold8-ultra/?sku=sku6049270?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="23f2c136-8a01-11f1-a81c-1dca9152d175" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,200 off w/ trade-in + unlimited @ Verizon" data-dimension25="">View Deal</a></p></div><p>One of the biggest differences between the Galaxy Z Fold 8 and Galaxy Z Fold 8 Ultra comes to down to display size. The Galaxy Z Fold 8 has a wider design that gives it an aspect ratio similar to an iPad mini, making it more suitable for watching videos.</p><p>It also steals the most unique features of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-trifold-review">Galaxy Z TriFold</a>: its three-app side-by-side multitasking. While the more expensive <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> can run up to four apps simultaneously, the Z Fold 8 has the inherent advantage because of how it lays them out. It can run three apps in their own windows, all at the same time — which it can do thanks to its 7.6-inch main display. What's great about this layout is that all three windows remain proportionate, with the ability to save them as an app pair shortcut for quick access later. And if you need just one more app, you can launch a fourth in a separate floating window.</p><p>Meanwhile, the Galaxy Z Fold 8 Ultra has a more square aspect ratio when opened. We tried running three apps on the Galaxy Z Fold 8 Ultra's 8-inch main display, but it would only let you run two properly. Sure, you can introduce a third app, but it forces the layout to change so that one app remains in full view on one side, while the other two share the remaining half. This isn’t ideal because those two apps get shrunken down to the point where they're almost unusable.</p><p>Bottom line: If you're looking to multitask Galaxy Z Fold 8 is the winner. </p><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Z Fold 8</p></th><th  ><p>Samsung Galaxy Z Fold 8 Ultra</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From $1,899 / £1,699</p></td><td  ><p>From $2,099 / £1,899</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong></p></td><td  ><p>7.6 inches AMOLED (1848 x 2448, 1-120Hz)</p></td><td  ><p>8 inches AMOLED (2504 x 2256, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong></p></td><td  ><p>5.5 inches AMOLED (1248 x 1972, 1-120Hz) </p></td><td  ><p>6.5 inches AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB / 16GB</p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB/512GB/1TB</p></td><td  ><p>256GB/512GB/1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP wide, 50MP Ultra wide (10x digital zoom)</p></td><td  ><p>200MP wide, 50MP ultra-wide, 10MP telephoto (3x optical)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover camera</strong></p></td><td  ><p>10MP</p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Main display camera</strong></p></td><td  ><p>10MP (f/2.2)</p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired / 20W wireless</p></td><td  ><p>45W wired / 20W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,800 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>123.9 x 81.9 x 9.7 mm (folded), 161.4 x 123.9 x 4.5 mm (unfolded)</p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.16 inches) unfolded</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>201 grams (7 ounces)</p></td><td  ><p>215 grams (7.5 ounces)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP48</p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong> </p></td><td  ><p>Lavender, Graphite, Cream, Pistachio (online)</p></td><td  ><p>Violet shadow, Cream, Graphite, Violet Green (online exclusive)</p></td></tr></tbody></table></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just realized the Samsung Galaxy Z Fold 8 Ultra fixes the worst thing about fingerprint scanners ]]></title>
                                                                                                <dc:content><![CDATA[ <p>One thing I really hate about getting a new phone is the setup process. Not only is it somewhat tedious, the actual process is incredibly inconsistent across different devices. The last few years have seen some major improvements to the way phones are set up, but the one thing that continually gets on my nerves is registering my fingerprints for biometric security.</p><p>That changed earlier this week when I set up the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Samsung Galaxy Z Fold 8 Ultra</a>, and realized that I should probably go through the process correctly. Only then did I realize that Samsung has been sitting on one of the simplest fingerprint mapping tools I've ever come across.</p><h2 id="galaxy-foldables-have-mastered-fingerprint-mapping-on-phones">Galaxy foldables have mastered fingerprint mapping on phones</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LoK247UUzdmF83TQmayS6g" name="Galaxy Z Fold 8 Ultra-12" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/LoK247UUzdmF83TQmayS6g-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The majority of devices that I have used over the past few years have had fingerprint scanners embedded in their display. Something about that design means that the actual process of registering a fingerprint for security reasons is a wearying experience that requires constantly tapping your chosen digit against the screen to capture the entire print.</p><p>Some systems are better than others, admittedly. Samsung's fingerprint registration is a fairly speedy affair, all things considered, while Google Pixels are among the slowest and laborious options on offer. This is still true following Google's decision to switch from optical fingerprint scanners to the more advanced (and secure) ultrasonic sensors. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:563px;"><p class="vanilla-image-block" style="padding-top:55.95%;"><img id="BxNRbJaK22Du2rxwcYySMb" name="ezgif-779ac4320ee377cb" alt="samsung galaxy z fold 8 ultra fingerprint scanner" src="https://cdn.mos.cms.futurecdn.net/BxNRbJaK22Du2rxwcYySMb-1920-80.gif" mos="" align="middle" fullscreen="" width="563" height="315" attribution="" endorsement="" 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 Galaxy foldables do it in a totally different way. Instead of being asked to constantly lift and move your chosen digit, all you need to do is move your fingerprint over the sensor. You don't have to remove your finger unless absolutely necessary, and the whole process takes less than ten seconds to do from start to finish.</p><p>The only kind of biometric security I've set up that comes close is Apple's Face ID. Since Apple's facial recognition only requires you to rotate your head around in a circle, it's extremely easy to do. But not even devices that still utilize Apple's Touch ID can map fingerprints quite so easily.</p><p>This feature isn't limited to the new Galaxy Z Fold 8 Ultra either. The process is exactly the same on the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a> and older Galaxy foldables, too. I was just too lazy to notice before, because I had foolishly assumed modern fingerprint scanners were all the same.</p><h2 id="it-s-a-reminder-how-much-better-physical-fingerprint-scanners-are">It's a reminder how much better physical fingerprint scanners are</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bNxK6GPNEgU8BWTJwTXshC" name="fingerprint-android.jpg" alt="Fingerprint reader on an Android phone." src="https://cdn.mos.cms.futurecdn.net/bNxK6GPNEgU8BWTJwTXshC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>It's been seven years since I regularly used a phone with a physical fingerprint scanner, but my short time with the Galaxy Z Fold 8 Ultra has reminded me just how much more convenient they are compared to modern alternatives. Not just in terms of the speedy mapping, which feels rather new to me, but also in the way they perform.</p><p>Day to day I use a <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-review-a-great-phone-but-it-doesnt-feel-like-much-of-an-upgrade">Pixel 10 Pro</a>, which features an ultrasonic in-display fingerprint scanner. Google's scanner isn't slow or inefficient by any means, but there is a brief delay between placing your finger on the scanner and the phone unlocking. That's especially true if you're not using an always-on display, as I tend to do, because you need to turn on the screen as well.</p><p>The physical fingerprint scanner takes all that out of the equation. The unlocking process is almost instant, and the fact you can feel the scanner without looking means you could potentially initiate the unlocking process before you've even looked at the phone screen. Those fractions of seconds don't matter much at the time, but if you consider how often you unlock your phone those extra fractions of seconds can add up.</p><h2 id="how-to-set-up-fingerprint-scanning-on-galaxy-z-fold-8-and-other-foldables">How to set up fingerprint scanning on Galaxy Z Fold 8 and other foldables</h2><section class="howto-block">                    <h3>1. Open biometric security</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/stAd3PmzKAuohqbmLz3ec7.jpg"                                        alt="samsung galaxy z fold 8 fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/stAd3PmzKAuohqbmLz3ec7.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>First up you need to open up the biometric security settings menu. You can do this by heading to <strong>Settings > Screen lock and biometrics > Fingerprints</strong></p></p>                </section><section class="howto-block">                    <h3>2. Add a new fingerprint</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/vJszKs6MpyZP7CnKV5mkP7.jpg"                                        alt="samsung galaxy z fold 8 fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/vJszKs6MpyZP7CnKV5mkP7.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>You'll need to start the process by tapping the <strong>Add fingerprint</strong> option half way down the page.</p></p>                </section><section class="howto-block">                    <h3>3. Start the mapping process</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/Cy49jiKXrLAEL733zQMqaT.jpg"                                        alt="galaxy z fold 8 ultra fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/Cy49jiKXrLAEL733zQMqaT.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>On the next screen, tap the <strong>Register</strong> button at the bottom of the screen.</p></p>                </section><section class="howto-block">                    <h3>4. Map your fingerprint</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/SGLcpf35ypVSoRn4fMfSkT.jpg"                                        alt="galaxy z fold 8 ultra fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/SGLcpf35ypVSoRn4fMfSkT.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>Next up you'll be prompted to map your fingerprint. Simply swipe your fingerprint across the power button/fingerprint scanner until you hit 100%</p></p>                </section><section class="howto-block">                    <h3>5. Test your fingerprint</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/eHytnaSi83dCH3WJCq6pgT.jpg"                                        alt="galaxy z fold 8 ultra fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/eHytnaSi83dCH3WJCq6pgT.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The Galaxy Z Fold 8 Ultra will then prompt you to test your fingerprint before letting you go. Just tap your finger against the scanner, and it'll tell you if everything has been registered successfully.</p></p>                </section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/my-first-36-hours-with-the-samsung-galaxy-z-fold-8-i-was-wrong-about-the-passport-screen-but-that-usd1-899-price-still-stings">My first 36 hours with the Samsung Galaxy Z Fold 8: I was wrong about the passport screen (but that $1,899 price still stings)</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-delay-leak-right-after-samsungs-triumphant-galaxy-fold-8-launch-has-me-sick-of-waiting-for-apples-foldable">iPhone Ultra delay leak right after Samsung's triumphant Galaxy Fold 8 launch has me sick of waiting for Apple's foldable</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/id-buy-a-galaxy-z-fold-8-over-the-z-fold-8-ultra-and-its-all-because-it-steals-this-z-trifold-feature">I'd buy a Galaxy Z Fold 8 over the Z Fold 8 Ultra — and it's all because it steals this Z TriFold feature</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-just-realized-the-samsung-galaxy-z-fold-8-ultra-fixes-the-worst-thing-about-fingerprint-scanners</link>
                                                                            <description>
                            <![CDATA[ The Galaxy Z Fold 8 Ultra and other foldables managed to solve my biggest issue with biometric security, and made mapping my fingerprints a breeze. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">kbYaArGnFJvwygJXXUqsTR</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/DMGaUbC3Xm5ezapCKdrW9f-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Mon, 27 Jul 2026 05:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/DMGaUbC3Xm5ezapCKdrW9f-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 Ultra shown in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 Ultra shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 Ultra shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/DMGaUbC3Xm5ezapCKdrW9f-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>One thing I really hate about getting a new phone is the setup process. Not only is it somewhat tedious, the actual process is incredibly inconsistent across different devices. The last few years have seen some major improvements to the way phones are set up, but the one thing that continually gets on my nerves is registering my fingerprints for biometric security.</p><p>That changed earlier this week when I set up the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Samsung Galaxy Z Fold 8 Ultra</a>, and realized that I should probably go through the process correctly. Only then did I realize that Samsung has been sitting on one of the simplest fingerprint mapping tools I've ever come across.</p><h2 id="galaxy-foldables-have-mastered-fingerprint-mapping-on-phones">Galaxy foldables have mastered fingerprint mapping on phones</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="LoK247UUzdmF83TQmayS6g" name="Galaxy Z Fold 8 Ultra-12" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/LoK247UUzdmF83TQmayS6g-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The majority of devices that I have used over the past few years have had fingerprint scanners embedded in their display. Something about that design means that the actual process of registering a fingerprint for security reasons is a wearying experience that requires constantly tapping your chosen digit against the screen to capture the entire print.</p><p>Some systems are better than others, admittedly. Samsung's fingerprint registration is a fairly speedy affair, all things considered, while Google Pixels are among the slowest and laborious options on offer. This is still true following Google's decision to switch from optical fingerprint scanners to the more advanced (and secure) ultrasonic sensors. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:563px;"><p class="vanilla-image-block" style="padding-top:55.95%;"><img id="BxNRbJaK22Du2rxwcYySMb" name="ezgif-779ac4320ee377cb" alt="samsung galaxy z fold 8 ultra fingerprint scanner" src="https://cdn.mos.cms.futurecdn.net/BxNRbJaK22Du2rxwcYySMb-1920-80.gif" mos="" align="middle" fullscreen="" width="563" height="315" attribution="" endorsement="" 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 Galaxy foldables do it in a totally different way. Instead of being asked to constantly lift and move your chosen digit, all you need to do is move your fingerprint over the sensor. You don't have to remove your finger unless absolutely necessary, and the whole process takes less than ten seconds to do from start to finish.</p><p>The only kind of biometric security I've set up that comes close is Apple's Face ID. Since Apple's facial recognition only requires you to rotate your head around in a circle, it's extremely easy to do. But not even devices that still utilize Apple's Touch ID can map fingerprints quite so easily.</p><p>This feature isn't limited to the new Galaxy Z Fold 8 Ultra either. The process is exactly the same on the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7</a> and older Galaxy foldables, too. I was just too lazy to notice before, because I had foolishly assumed modern fingerprint scanners were all the same.</p><h2 id="it-s-a-reminder-how-much-better-physical-fingerprint-scanners-are">It's a reminder how much better physical fingerprint scanners are</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="bNxK6GPNEgU8BWTJwTXshC" name="fingerprint-android.jpg" alt="Fingerprint reader on an Android phone." src="https://cdn.mos.cms.futurecdn.net/bNxK6GPNEgU8BWTJwTXshC-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Shutterstock)</span></figcaption></figure><p>It's been seven years since I regularly used a phone with a physical fingerprint scanner, but my short time with the Galaxy Z Fold 8 Ultra has reminded me just how much more convenient they are compared to modern alternatives. Not just in terms of the speedy mapping, which feels rather new to me, but also in the way they perform.</p><p>Day to day I use a <a href="https://www.tomsguide.com/phones/google-pixel-phones/google-pixel-10-pro-review-a-great-phone-but-it-doesnt-feel-like-much-of-an-upgrade">Pixel 10 Pro</a>, which features an ultrasonic in-display fingerprint scanner. Google's scanner isn't slow or inefficient by any means, but there is a brief delay between placing your finger on the scanner and the phone unlocking. That's especially true if you're not using an always-on display, as I tend to do, because you need to turn on the screen as well.</p><p>The physical fingerprint scanner takes all that out of the equation. The unlocking process is almost instant, and the fact you can feel the scanner without looking means you could potentially initiate the unlocking process before you've even looked at the phone screen. Those fractions of seconds don't matter much at the time, but if you consider how often you unlock your phone those extra fractions of seconds can add up.</p><h2 id="how-to-set-up-fingerprint-scanning-on-galaxy-z-fold-8-and-other-foldables">How to set up fingerprint scanning on Galaxy Z Fold 8 and other foldables</h2><section class="howto-block">                    <h3>1. Open biometric security</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/stAd3PmzKAuohqbmLz3ec7.jpg"                                        alt="samsung galaxy z fold 8 fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/stAd3PmzKAuohqbmLz3ec7.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>First up you need to open up the biometric security settings menu. You can do this by heading to <strong>Settings > Screen lock and biometrics > Fingerprints</strong></p></p>                </section><section class="howto-block">                    <h3>2. Add a new fingerprint</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/vJszKs6MpyZP7CnKV5mkP7.jpg"                                        alt="samsung galaxy z fold 8 fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/vJszKs6MpyZP7CnKV5mkP7.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>You'll need to start the process by tapping the <strong>Add fingerprint</strong> option half way down the page.</p></p>                </section><section class="howto-block">                    <h3>3. Start the mapping process</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/Cy49jiKXrLAEL733zQMqaT.jpg"                                        alt="galaxy z fold 8 ultra fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/Cy49jiKXrLAEL733zQMqaT.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>On the next screen, tap the <strong>Register</strong> button at the bottom of the screen.</p></p>                </section><section class="howto-block">                    <h3>4. Map your fingerprint</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/SGLcpf35ypVSoRn4fMfSkT.jpg"                                        alt="galaxy z fold 8 ultra fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/SGLcpf35ypVSoRn4fMfSkT.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>Next up you'll be prompted to map your fingerprint. Simply swipe your fingerprint across the power button/fingerprint scanner until you hit 100%</p></p>                </section><section class="howto-block">                    <h3>5. Test your fingerprint</h3>                    <figure>                            <p class="bordeaux-image-check">                                <img    src="https://cdn.mos.cms.futurecdn.net/eHytnaSi83dCH3WJCq6pgT.jpg"                                        alt="galaxy z fold 8 ultra fingerprint scanner"                                        onerror="this.parentNode.replaceChild(window.missingImage(),this)"                                        data-pin-media="https://cdn.mos.cms.futurecdn.net/eHytnaSi83dCH3WJCq6pgT.jpg"                                        class="expandable van-old-layout-image">                            </p><div class="credit">(Image: © Future)</div></figure>                    <p><p>The Galaxy Z Fold 8 Ultra will then prompt you to test your fingerprint before letting you go. Just tap your finger against the scanner, and it'll tell you if everything has been registered successfully.</p></p>                </section><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/my-first-36-hours-with-the-samsung-galaxy-z-fold-8-i-was-wrong-about-the-passport-screen-but-that-usd1-899-price-still-stings">My first 36 hours with the Samsung Galaxy Z Fold 8: I was wrong about the passport screen (but that $1,899 price still stings)</a></li><li><a href="https://www.tomsguide.com/phones/iphones/iphone-ultra-delay-leak-right-after-samsungs-triumphant-galaxy-fold-8-launch-has-me-sick-of-waiting-for-apples-foldable">iPhone Ultra delay leak right after Samsung's triumphant Galaxy Fold 8 launch has me sick of waiting for Apple's foldable</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/id-buy-a-galaxy-z-fold-8-over-the-z-fold-8-ultra-and-its-all-because-it-steals-this-z-trifold-feature">I'd buy a Galaxy Z Fold 8 over the Z Fold 8 Ultra — and it's all because it steals this Z TriFold feature</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I tried using the Galaxy Z Fold 8’s MyFanCam on my dogs, but I hit a major wall ]]></title>
                                                                                                <dc:content><![CDATA[ <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Samsung Galaxy Z 8</a> series seems mostly focused on hardware upgrades, but there are still some excellent new AI and software features for you to take advantage of. My current favorite is MyFanCam, which edits a video to follow an individual rather than including the entire frame. Unfortunately, having tested the feature, there's one downside I didn't anticipate.</p><p>I have two very energetic dogs, and I had hoped MyFanCam would help make videos of them playing a little easier to follow. Unfortunately the AI is only capable of recognizing people, which means my dreams of more stable and easy to follow videos of my dog chasing a ball have been dashed — for now.</p><div class="product"><a data-dimension112="827571f4-87a4-11f1-b7eb-3d8306df317c" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25="$0" href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" 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="airedale-K3AQ3stDNey4NiS8bxtM7X-0" name="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow" data-dimension112="827571f4-87a4-11f1-b7eb-3d8306df317c" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25="$0"><strong>up to $600 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $600 off its Galaxy Z Flip 8 preorder when you trade-in an older phone. Or you can get a $150 Samsung credit with no trade-in. <br><br><strong>Also check out these coupons: </strong><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%252Fbusiness%252F%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus%25252Fbusiness%25252F&type=product&id=484787-2980b2d8ea6df6e4862885a89caed91f32c72d772580cb1185c2befed5887890&productType=vouchers" target="_blank" rel="nofollow"><strong>Claim up to 15% off selected items using this Samsung discount code</strong></a><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus&type=product&id=484787-MmU2NTQwZWZlNzE4&productType=vouchers" target="_blank" rel="nofollow"><strong>Use this Samsung coupon code to get 10% off selected items</strong></a><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus&type=product&id=503204-1408379270&productType=vouchers" target="_blank" rel="nofollow"><strong>Get 10% off orders using this Samsung discount code</strong></a><a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow" data-dimension112="827571f4-87a4-11f1-b7eb-3d8306df317c" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25="$0">View Deal</a></p></div><div class="product"><a data-dimension112="82757276-87a4-11f1-8375-5bca0f20cf5b" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="$0" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" 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="airedale-QJ4rKzJiVJEYbAeupkwY9m-1" name="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="82757276-87a4-11f1-8375-5bca0f20cf5b" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="$0"><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in.<br><br><strong>Also check out these coupons: </strong><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%252Fbusiness%252F%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus%25252Fbusiness%25252F&type=product&id=484787-2980b2d8ea6df6e4862885a89caed91f32c72d772580cb1185c2befed5887890&productType=vouchers" target="_blank" rel="nofollow"><strong>Claim up to 15% off selected items using this Samsung discount code</strong></a><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus&type=product&id=484787-MmU2NTQwZWZlNzE4&productType=vouchers" target="_blank" rel="nofollow"><strong>Use this Samsung coupon code to get 10% off selected items</strong></a><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus&type=product&id=503204-1408379270&productType=vouchers" target="_blank" rel="nofollow"><strong>Get 10% off orders using this Samsung discount code</strong></a><a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="82757276-87a4-11f1-8375-5bca0f20cf5b" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="$0">View Deal</a></p></div><h2 id="what-is-myfancam">What is MyFanCam?</h2><p>MyFanCam is a new Galaxy AI feature that's been released on the Galaxy Z Fold 8 Ultra, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-everything-you-need-to-know-about-the-new-wider-foldable">Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Z Flip 8</a>. The idea behind it is that you can reframe existing videos and shift the focus onto individual subjects rather than everything as a whole. Samsung's example videos feature people dancing together and utilizing MyFanCam to focus on a single member of the troupe. </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/N2AtiagWdxA" allowfullscreen></iframe></div></div><p>This isn't a dedicated camera mode that follows people in frame, though. That feature has existed for a few years, and it's called Video Auto Framing. Instead, this is an AI editing feature, which takes videos you've already recorded and applies the principles of MyFanCam to the people in shot. </p><p>I was able to do it with videos I recorded as far back as 2019 on a non-Samsung phone. That's helpful, because it means you could breathe new life into your old videos, without having to worry about whether they have the right markers for Galaxy AI to do what needs to be done.</p><p>The other obvious benefit here is that you don't need to worry about getting the perfect shot while you're busy recording. In the same way that <a href="https://www.tomsguide.com/phones/iphones/i-just-installed-the-ios-27-beta-and-reframe-is-unlike-any-other-ai-feature-ive-come-across">Reframe in iOS 27</a> will let you tweak the perspective of your photos, MyFanCam lets you change the main focus of the video so that viewers can hone in on what's important.</p><p>It's also worth noting that MyFanCam can't focus on more than one subject at a time, because that defeats the whole purpose of the feature. However you can always go back and make another MyFanCam video that focuses on someone else. </p><p>So in that group of three dancers, you could potentially end up with three additional takes on the very same video.</p><h2 id="it-only-seems-to-work-on-people-right-now">It only seems to work on people right now</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1723px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="trjgZiS9afkr2BxJb2oaZL" name="Screenshot_20260724_171511_Studio" alt="samsung galaxy z fold 8 myfancam testing" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:381,l:299,cw:1723,ch:1723,q:80/trjgZiS9afkr2BxJb2oaZL.jpg" mos="" align="middle" fullscreen="" width="2504" height="2256" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I like taking photos and shooting videos of my dogs. They're adorable for one, but you never know when they're going to do something stupid and hilarious. The problem is keeping track of them when they're off their leash, and bolting around the local park. They're moving so quickly, and are often so far away, that I just can't keep track of them with my camera.</p><p>Sadly, running videos of my dogs playing through MyFanCam did... nothing. The AI didn't register that the dogs were there, which obviously meant that it wasn't able to focus on one of them and edit the video accordingly. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1729px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ErCuynTe3khLM7kcAJJiRK" name="Screenshot_20260724_171351_Studio" alt="samsung galaxy z fold 8 myfancam testing" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:381,l:321,cw:1729,ch:1729,q:80/ErCuynTe3khLM7kcAJJiRK.jpg" mos="" align="middle" fullscreen="" width="2504" height="2256" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I then went back and checked it against a video of me and one of my dogs clearly in frame, just to see what happened. As expected, it picked me up right away, but was apparently oblivious to my furry companion. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1873px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="MKjqWSQsnayNcMHYG9dB8K" name="Screenshot_20260724_171324_Studio" alt="samsung galaxy z fold 8 myfancam testing" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:242,l:631,cw:1873,ch:1873,q:80/MKjqWSQsnayNcMHYG9dB8K.jpg" mos="" align="middle" fullscreen="" width="2504" height="2256" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Oddly intrigued, I tried to find some bizarre videos of people, and see how well Galaxy AI was able to pick up people in situations that are a little out of the ordinary. It had no problem focusing on a Berlin street performer that was doing a handstand on a skateboard, but it had trouble recognizing that a mid-performance routine was a human being. Similarly, adolescent gorillas at the zoo straight-up didn't register.</p><p>If you want to know something quite funny, MyFanCam was able to focus on certain characters on the parade floats at Disney World, including Pluto and Chip — but it struggled with Goofy. Clearly not even AI is sure what Goofy is supposed to be, because he's sure as heck not a dog.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1711px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="QqHaq5XK2MHEFu3AmMVxXK" name="Screenshot_20260724_171418_Studio" alt="samsung galaxy z fold 8 myfancam testing" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:417,l:321,cw:1711,ch:1711,q:80/QqHaq5XK2MHEFu3AmMVxXK.jpg" mos="" align="middle" fullscreen="" width="2504" height="2256" attribution="" endorsement="" 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 can't tell you whether Samsung has done this deliberately or not, but in my experience attempting to use AI camera features, I've noticed that it only really plays along when people are involved. <a href="https://www.tomsguide.com/phones/google-pixel-phones/how-to-use-google-pixel-9-add-me-tool">Google's Add me</a> feature is a very good example of this, since it also wouldn't register that my dogs were living, moving creatures that could move in and out of photos as they saw fit.</p><p>As for why, I can only assume that it's because the AI utilized by these camera features has only been trained on people. Tech companies likely figured that people would mostly want to photograph or video their friends and family. </p><p>Try and get the AI to register something slightly out of the usual parameters and it'll struggle. I guess people are easier for AI models to understand, whereas animals and pets come in all kinds of different shapes and sizes.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ORMNzW"></div>                            </div>                            <script src="https://kwizly.com/embed/ORMNzW.js" async></script><h2 id="bottom-line-4">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2772px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="sG4D9mpBszMGgWBxFvE29W" name="Galaxy Z Fold 8-38" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/sG4D9mpBszMGgWBxFvE29W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2772" height="1559" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Despite that obvious flaw, I feel as though MyFanCam has potential. The idea that you can go back to a video and completely reshape what people see, and without resorting to changing things with generative AI, is quite impressive. </p><p>I'm disappointed by the lack of support for pets, though. As anyone with energetic animals in their lives can likely attest, capturing them on camera can be rather difficult. I was so looking forward to getting MyFanCam to get to work on the videos of my dogs, but sadly that wasn't meant to be. Hopefully it's something Samsung can work on, and roll out to Galaxy phones and roll out as a software update in the near future.</p><p>In the meantime, just make sure to keep your editing focused on people.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one">Galaxy Z Fold 8 Ultra doesn't have a crease-free display — but it's the closest Samsung has ever got to one</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-tried-using-the-galaxy-z-fold-8s-myfancam-on-my-dogs-but-i-hit-a-major-wall</link>
                                                                            <description>
                            <![CDATA[ I had hoped MyFanCam could work its magic on videos of my hyperactive dogs, but it only works on people. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Z7nQeoCiM8EK3DKokiKDEZ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/f36THwqTLhj3VY5eNSgLyW-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sun, 26 Jul 2026 07:15:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/f36THwqTLhj3VY5eNSgLyW-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/f36THwqTLhj3VY5eNSgLyW-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>The <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Samsung Galaxy Z 8</a> series seems mostly focused on hardware upgrades, but there are still some excellent new AI and software features for you to take advantage of. My current favorite is MyFanCam, which edits a video to follow an individual rather than including the entire frame. Unfortunately, having tested the feature, there's one downside I didn't anticipate.</p><p>I have two very energetic dogs, and I had hoped MyFanCam would help make videos of them playing a little easier to follow. Unfortunately the AI is only capable of recognizing people, which means my dreams of more stable and easy to follow videos of my dog chasing a ball have been dashed — for now.</p><div class="product"><a data-dimension112="827571f4-87a4-11f1-b7eb-3d8306df317c" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25="$0" href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" 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="airedale-K3AQ3stDNey4NiS8bxtM7X-0" name="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow" data-dimension112="827571f4-87a4-11f1-b7eb-3d8306df317c" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25="$0"><strong>up to $600 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $600 off its Galaxy Z Flip 8 preorder when you trade-in an older phone. Or you can get a $150 Samsung credit with no trade-in. <br><br><strong>Also check out these coupons: </strong><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%252Fbusiness%252F%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus%25252Fbusiness%25252F&type=product&id=484787-2980b2d8ea6df6e4862885a89caed91f32c72d772580cb1185c2befed5887890&productType=vouchers" target="_blank" rel="nofollow"><strong>Claim up to 15% off selected items using this Samsung discount code</strong></a><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus&type=product&id=484787-MmU2NTQwZWZlNzE4&productType=vouchers" target="_blank" rel="nofollow"><strong>Use this Samsung coupon code to get 10% off selected items</strong></a><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus&type=product&id=503204-1408379270&productType=vouchers" target="_blank" rel="nofollow"><strong>Get 10% off orders using this Samsung discount code</strong></a><a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow" data-dimension112="827571f4-87a4-11f1-b7eb-3d8306df317c" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25="$0">View Deal</a></p></div><div class="product"><a data-dimension112="82757276-87a4-11f1-8375-5bca0f20cf5b" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="$0" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" 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="airedale-QJ4rKzJiVJEYbAeupkwY9m-1" name="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1000" height="1000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="82757276-87a4-11f1-8375-5bca0f20cf5b" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="$0"><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in.<br><br><strong>Also check out these coupons: </strong><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%252Fbusiness%252F%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus%25252Fbusiness%25252F&type=product&id=484787-2980b2d8ea6df6e4862885a89caed91f32c72d772580cb1185c2befed5887890&productType=vouchers" target="_blank" rel="nofollow"><strong>Claim up to 15% off selected items using this Samsung discount code</strong></a><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus&type=product&id=484787-MmU2NTQwZWZlNzE4&productType=vouchers" target="_blank" rel="nofollow"><strong>Use this Samsung coupon code to get 10% off selected items</strong></a><br>🎟️ <a href="https://www.techradar.com/outlink?subtag=hawk-custom-tracking&countryCode=US&siteCode=techradar&secCode=b022b312c3d79d3c8edc4b4925be465f624ac4ca00de31384a58b09177cc573b&redirect=https%3A%2F%2Fc.next2.io%3Fsid%3D11175266%26said%3Dtechradar.com%26partnerId%3Dhawk-custom-tracking%26link%3Dhttps%253A%252F%252Fwww.samsung.com%252Fus%26merchantId%3D214378%26fallback_url%3Dhttps%253A%252F%252Fclick.linksynergy.com%252Fdeeplink%253Fid%253DizUPF8VmRng%2526mid%253D47773%2526u1%253Dhawk-custom-tracking%2526murl%253Dhttps%25253A%25252F%25252Fwww.samsung.com%25252Fus&type=product&id=503204-1408379270&productType=vouchers" target="_blank" rel="nofollow"><strong>Get 10% off orders using this Samsung discount code</strong></a><a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="82757276-87a4-11f1-8375-5bca0f20cf5b" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="$0">View Deal</a></p></div><h2 id="what-is-myfancam">What is MyFanCam?</h2><p>MyFanCam is a new Galaxy AI feature that's been released on the Galaxy Z Fold 8 Ultra, <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-everything-you-need-to-know-about-the-new-wider-foldable">Z Fold 8</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Z Flip 8</a>. The idea behind it is that you can reframe existing videos and shift the focus onto individual subjects rather than everything as a whole. Samsung's example videos feature people dancing together and utilizing MyFanCam to focus on a single member of the troupe. </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/N2AtiagWdxA" allowfullscreen></iframe></div></div><p>This isn't a dedicated camera mode that follows people in frame, though. That feature has existed for a few years, and it's called Video Auto Framing. Instead, this is an AI editing feature, which takes videos you've already recorded and applies the principles of MyFanCam to the people in shot. </p><p>I was able to do it with videos I recorded as far back as 2019 on a non-Samsung phone. That's helpful, because it means you could breathe new life into your old videos, without having to worry about whether they have the right markers for Galaxy AI to do what needs to be done.</p><p>The other obvious benefit here is that you don't need to worry about getting the perfect shot while you're busy recording. In the same way that <a href="https://www.tomsguide.com/phones/iphones/i-just-installed-the-ios-27-beta-and-reframe-is-unlike-any-other-ai-feature-ive-come-across">Reframe in iOS 27</a> will let you tweak the perspective of your photos, MyFanCam lets you change the main focus of the video so that viewers can hone in on what's important.</p><p>It's also worth noting that MyFanCam can't focus on more than one subject at a time, because that defeats the whole purpose of the feature. However you can always go back and make another MyFanCam video that focuses on someone else. </p><p>So in that group of three dancers, you could potentially end up with three additional takes on the very same video.</p><h2 id="it-only-seems-to-work-on-people-right-now">It only seems to work on people right now</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1723px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="trjgZiS9afkr2BxJb2oaZL" name="Screenshot_20260724_171511_Studio" alt="samsung galaxy z fold 8 myfancam testing" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:381,l:299,cw:1723,ch:1723,q:80/trjgZiS9afkr2BxJb2oaZL.jpg" mos="" align="middle" fullscreen="" width="2504" height="2256" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I like taking photos and shooting videos of my dogs. They're adorable for one, but you never know when they're going to do something stupid and hilarious. The problem is keeping track of them when they're off their leash, and bolting around the local park. They're moving so quickly, and are often so far away, that I just can't keep track of them with my camera.</p><p>Sadly, running videos of my dogs playing through MyFanCam did... nothing. The AI didn't register that the dogs were there, which obviously meant that it wasn't able to focus on one of them and edit the video accordingly. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1729px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="ErCuynTe3khLM7kcAJJiRK" name="Screenshot_20260724_171351_Studio" alt="samsung galaxy z fold 8 myfancam testing" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:381,l:321,cw:1729,ch:1729,q:80/ErCuynTe3khLM7kcAJJiRK.jpg" mos="" align="middle" fullscreen="" width="2504" height="2256" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>I then went back and checked it against a video of me and one of my dogs clearly in frame, just to see what happened. As expected, it picked me up right away, but was apparently oblivious to my furry companion. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1873px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="MKjqWSQsnayNcMHYG9dB8K" name="Screenshot_20260724_171324_Studio" alt="samsung galaxy z fold 8 myfancam testing" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:242,l:631,cw:1873,ch:1873,q:80/MKjqWSQsnayNcMHYG9dB8K.jpg" mos="" align="middle" fullscreen="" width="2504" height="2256" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Oddly intrigued, I tried to find some bizarre videos of people, and see how well Galaxy AI was able to pick up people in situations that are a little out of the ordinary. It had no problem focusing on a Berlin street performer that was doing a handstand on a skateboard, but it had trouble recognizing that a mid-performance routine was a human being. Similarly, adolescent gorillas at the zoo straight-up didn't register.</p><p>If you want to know something quite funny, MyFanCam was able to focus on certain characters on the parade floats at Disney World, including Pluto and Chip — but it struggled with Goofy. Clearly not even AI is sure what Goofy is supposed to be, because he's sure as heck not a dog.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1711px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="QqHaq5XK2MHEFu3AmMVxXK" name="Screenshot_20260724_171418_Studio" alt="samsung galaxy z fold 8 myfancam testing" src="https://cdn.mos.cms.futurecdn.net/v2/w:1920,t:417,l:321,cw:1711,ch:1711,q:80/QqHaq5XK2MHEFu3AmMVxXK.jpg" mos="" align="middle" fullscreen="" width="2504" height="2256" attribution="" endorsement="" 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 can't tell you whether Samsung has done this deliberately or not, but in my experience attempting to use AI camera features, I've noticed that it only really plays along when people are involved. <a href="https://www.tomsguide.com/phones/google-pixel-phones/how-to-use-google-pixel-9-add-me-tool">Google's Add me</a> feature is a very good example of this, since it also wouldn't register that my dogs were living, moving creatures that could move in and out of photos as they saw fit.</p><p>As for why, I can only assume that it's because the AI utilized by these camera features has only been trained on people. Tech companies likely figured that people would mostly want to photograph or video their friends and family. </p><p>Try and get the AI to register something slightly out of the usual parameters and it'll struggle. I guess people are easier for AI models to understand, whereas animals and pets come in all kinds of different shapes and sizes.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-ORMNzW"></div>                            </div>                            <script src="https://kwizly.com/embed/ORMNzW.js" async></script><h2 id="bottom-line-4">Bottom line</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2772px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="sG4D9mpBszMGgWBxFvE29W" name="Galaxy Z Fold 8-38" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/sG4D9mpBszMGgWBxFvE29W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2772" height="1559" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Despite that obvious flaw, I feel as though MyFanCam has potential. The idea that you can go back to a video and completely reshape what people see, and without resorting to changing things with generative AI, is quite impressive. </p><p>I'm disappointed by the lack of support for pets, though. As anyone with energetic animals in their lives can likely attest, capturing them on camera can be rather difficult. I was so looking forward to getting MyFanCam to get to work on the videos of my dogs, but sadly that wasn't meant to be. Hopefully it's something Samsung can work on, and roll out to Galaxy phones and roll out as a software update in the near future.</p><p>In the meantime, just make sure to keep your editing focused on people.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one">Galaxy Z Fold 8 Ultra doesn't have a crease-free display — but it's the closest Samsung has ever got to one</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Fold 8, Fold 8 Ultra, and Flip 8 battery life tested — silicon carbon pays off ]]></title>
                                                                                                <dc:content><![CDATA[ <p>As much as I rave about the extra utility that the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> have over traditional slabs, there’s one unspoken compromise they make: subpar battery life. Even though I personally don't mind topping off at some point during the workday, doing so can be a deal breaker for anyone who craves all-day endurance.</p><p>With the launch of Samsung’s new foldables, they certainly have a lot to prove — more so when they’re also some of the thinnest and lightest models to date. The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Z Fold 8</a>, and <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a> are notable as the first Samsung devices to adopt silicon-carbon batteries, which pack more capacity without adding extra bulk.</p><p>Paired with the power-efficient <a href="https://www.tomsguide.com/phones/android-phones/qualcomms-snapdragon-8-elite-gen-5-promises-big-performance-and-ai-upgrades-and-we-could-see-them-in-the-galaxy-s26-ultra">Snapdragon 8 Elite Gen 5 </a>silicon, they’re bound to be some of the longest-lasting foldables to pass through the Tom’s Guide labs. After putting them through a barrage of battery drain tests, I can tell you they don’t disappoint.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-life-results"><span>Galaxy Z Fold 8 vs Fold 8 Ultra vs Flip 8: Battery life results</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery Capacity (mAh)</strong></p></td><td  ><p><strong>Battery Life (hrs:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>4,300 mAh</p></td><td  ><p>12:50</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>4,300 mAh</p></td><td  ><p>12:24</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra (2026)</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>16:20</p></td></tr></tbody></table></div><p>Interestingly, the Z Flip 8’s battery life performance doesn’t seem as dramatic as the other phones — especially considering it packs the same 4,300 mAh capacity as before. What’s different this time is how Samsung engineered the phone to be thinner and lighter than its predecessor without compromising on battery capacity.</p><p>The new flip-style phone clocks in at 12 hours and 50 minutes, representing a 3.5% increase over the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection">Flip 7’s</a> 12:24 runtime. Against its biggest rival, the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Razr Ultra (2026)</a>, Motorola still holds the title of the longest-lasting flip phone with a time of 16 hours and 20 minutes. That’s a huge gap, primarily aided by Motorola's massive 5,000 mAh battery.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery Capacity (mAh)</strong></p></td><td  ><p><strong>Battery Life (hrs:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>4,800 mAh</p></td><td  ><p>12:20</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>14:09</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>4,400 mAh</p></td><td  ><p>10:44</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Fold</strong></p></td><td  ><p>6,000 mAh</p></td><td  ><p>14:44</p></td></tr><tr><td class="firstcol " ><p><strong>Pixel 10 Pro Fold</strong></p></td><td  ><p>5,015 mAh</p></td><td  ><p>12:16</p></td></tr></tbody></table></div><p>Despite this, where Samsung truly makes a massive leap is in its flagship book-style foldables. The premier Galaxy Z Fold 8 Ultra logs an extraordinary 14 hours and 9 minutes, blowing past the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Z Fold 7’s</a> 10 hours and 44 minutes. That’s an<strong> impressive 31.8% increase in endurance</strong>. Likewise, the Galaxy Z Fold 8 also sees a substantial gain at 12 hours and 20 minutes — a 14.8% improvement compared to last year's Fold 7.</p><p>Against its key rivals, the Z Fold 8 Ultra proves it can hold its ground with the best in the business. Clocking in at 14 hours and 9 minutes, Samsung's premium foldable comfortably outperforms the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Google Pixel 10 Pro Fold</a> by a margin of 15.3%.</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-charging-speeds"><span>Galaxy Z Fold 8 vs Fold 8 Ultra vs Flip 8: Charging speeds</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Charging Speed (in 15 minutes)</strong></p></td><td  ><p><strong>Charging Speed (in 30 minutes)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>43%</p></td><td  ><p>70%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>49%</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>28%</p></td><td  ><p>54%</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Fold</strong></p></td><td  ><p>41%</p></td><td  ><p>73%</p></td></tr><tr><td class="firstcol " ><p><strong>Pixel 10 Pro Fold</strong></p></td><td  ><p>28%</p></td><td  ><p>58%</p></td></tr></tbody></table></div><p>Charging is another area where Samsung’s new phones make noticeable gains — specifically with a bump to 45W wired charging across all three models. That’s a welcome increase from the previous 25W cap, allowing them to juice up much faster in the same timeframe.</p><p>The Galaxy Z Fold 8 Ultra leads the pack, <strong>hitting 49% in 15 minutes and 76% in 30 minutes</strong>. That’s an impressive leap over the Z Fold 7’s 54% mark, even outstripping the Motorola Razr Fold’s 73%. The standard Z Fold 8 also impresses by reaching 70% in half an hour.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Charging Speed (in 15 minutes)</strong></p></td><td  ><p><strong>Charging Speed (in 30 minutes)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>35%</p></td><td  ><p>59%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>29%</p></td><td  ><p>55%</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra (2026)</strong></p></td><td  ><p>42%</p></td><td  ><p>74%</p></td></tr></tbody></table></div><p>Meanwhile, the Z Flip 8 offers a slighter improvement over its predecessor, reaching 59% in 30 minutes compared to the Flip 7’s 55% — a surprisingly modest gain given the wattage upgrade. While that still trails the Motorola Razr Ultra’s blazing 74% charge result, Samsung’s entire 2026 lineup comfortably outpaces rivals like the Google Pixel 10 Pro Fold (58%), ensuring less time tethered to a wall adapter.</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-verdict"><span>Galaxy Z Fold 8 vs Fold 8 Ultra vs Flip 8: 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:4318px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PEQ4Xb5Gy5qwqg5NJJmYv" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/PEQ4Xb5Gy5qwqg5NJJmYv-1920-80.jpg" mos="" align="middle" fullscreen="" width="4318" height="2429" attribution="" endorsement="" class="inline"></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 weren’t convinced already, I’ll state it again: silicon-carbon batteries are making a massive impact — and Samsung’s new foldables cement my sentiment. Foldable phones have come a long way, and battery performance is no longer one of their compromises.</p><p>By introducing silicon-carbon battery technology alongside 45W wired charging, Samsung’s 2026 Galaxy Z lineup delivers meaningful upgrades where it matters most and makes them solid <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">best phone battery life </a>contenders. These improvements should translate to tangible real-world gains, powering you through a full workday without the constant need to top off.</p><p>While Motorola continues to push the upper boundaries of battery life with its Razr series, Samsung’s Galaxy Z Fold 8 Ultra stands out as the ultimate powerhouse, comfortably outlasting rivals like the Pixel 10 Pro Fold while charging faster than ever before. Whether you prefer a compact flip or an immersive book-style screen, you can finally enjoy foldable productivity without constantly watching your battery level.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e47Y4X"></div>                            </div>                            <script src="https://kwizly.com/embed/e47Y4X.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/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">‘We're pretty confident': How Samsung plans to fight the first foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-tests-silicon-carbon-pays-off</link>
                                                                            <description>
                            <![CDATA[ Armed with silicon-carbon batteries, Samsung’s new foldables deliver massive generational battery gains led by the Z Fold 8 Ultra. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Znp6ZXPf4UfqPWZWfDpivF</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Lrz7DaxqAmqjxTXCRxXmTQ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Sat, 25 Jul 2026 04:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/Lrz7DaxqAmqjxTXCRxXmTQ-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[The Samsung Galaxy Z 8 lineup in hand]]></media:description>                                                            <media:text><![CDATA[The Samsung Galaxy Z 8 lineup in hand]]></media:text>
                                <media:title type="plain"><![CDATA[The Samsung Galaxy Z 8 lineup in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Lrz7DaxqAmqjxTXCRxXmTQ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>As much as I rave about the extra utility that the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> have over traditional slabs, there’s one unspoken compromise they make: subpar battery life. Even though I personally don't mind topping off at some point during the workday, doing so can be a deal breaker for anyone who craves all-day endurance.</p><p>With the launch of Samsung’s new foldables, they certainly have a lot to prove — more so when they’re also some of the thinnest and lightest models to date. The <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Z Fold 8</a>, and <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a> are notable as the first Samsung devices to adopt silicon-carbon batteries, which pack more capacity without adding extra bulk.</p><p>Paired with the power-efficient <a href="https://www.tomsguide.com/phones/android-phones/qualcomms-snapdragon-8-elite-gen-5-promises-big-performance-and-ai-upgrades-and-we-could-see-them-in-the-galaxy-s26-ultra">Snapdragon 8 Elite Gen 5 </a>silicon, they’re bound to be some of the longest-lasting foldables to pass through the Tom’s Guide labs. After putting them through a barrage of battery drain tests, I can tell you they don’t disappoint.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-battery-life-results"><span>Galaxy Z Fold 8 vs Fold 8 Ultra vs Flip 8: Battery life results</span></h3><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery Capacity (mAh)</strong></p></td><td  ><p><strong>Battery Life (hrs:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>4,300 mAh</p></td><td  ><p>12:50</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>4,300 mAh</p></td><td  ><p>12:24</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra (2026)</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>16:20</p></td></tr></tbody></table></div><p>Interestingly, the Z Flip 8’s battery life performance doesn’t seem as dramatic as the other phones — especially considering it packs the same 4,300 mAh capacity as before. What’s different this time is how Samsung engineered the phone to be thinner and lighter than its predecessor without compromising on battery capacity.</p><p>The new flip-style phone clocks in at 12 hours and 50 minutes, representing a 3.5% increase over the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection">Flip 7’s</a> 12:24 runtime. Against its biggest rival, the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Razr Ultra (2026)</a>, Motorola still holds the title of the longest-lasting flip phone with a time of 16 hours and 20 minutes. That’s a huge gap, primarily aided by Motorola's massive 5,000 mAh battery.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Battery Capacity (mAh)</strong></p></td><td  ><p><strong>Battery Life (hrs:mins)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>4,800 mAh</p></td><td  ><p>12:20</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>5,000 mAh</p></td><td  ><p>14:09</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>4,400 mAh</p></td><td  ><p>10:44</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Fold</strong></p></td><td  ><p>6,000 mAh</p></td><td  ><p>14:44</p></td></tr><tr><td class="firstcol " ><p><strong>Pixel 10 Pro Fold</strong></p></td><td  ><p>5,015 mAh</p></td><td  ><p>12:16</p></td></tr></tbody></table></div><p>Despite this, where Samsung truly makes a massive leap is in its flagship book-style foldables. The premier Galaxy Z Fold 8 Ultra logs an extraordinary 14 hours and 9 minutes, blowing past the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Z Fold 7’s</a> 10 hours and 44 minutes. That’s an<strong> impressive 31.8% increase in endurance</strong>. Likewise, the Galaxy Z Fold 8 also sees a substantial gain at 12 hours and 20 minutes — a 14.8% improvement compared to last year's Fold 7.</p><p>Against its key rivals, the Z Fold 8 Ultra proves it can hold its ground with the best in the business. Clocking in at 14 hours and 9 minutes, Samsung's premium foldable comfortably outperforms the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Google Pixel 10 Pro Fold</a> by a margin of 15.3%.</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-charging-speeds"><span>Galaxy Z Fold 8 vs Fold 8 Ultra vs Flip 8: Charging speeds</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Charging Speed (in 15 minutes)</strong></p></td><td  ><p><strong>Charging Speed (in 30 minutes)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>43%</p></td><td  ><p>70%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>49%</p></td><td  ><p>76%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>28%</p></td><td  ><p>54%</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Fold</strong></p></td><td  ><p>41%</p></td><td  ><p>73%</p></td></tr><tr><td class="firstcol " ><p><strong>Pixel 10 Pro Fold</strong></p></td><td  ><p>28%</p></td><td  ><p>58%</p></td></tr></tbody></table></div><p>Charging is another area where Samsung’s new phones make noticeable gains — specifically with a bump to 45W wired charging across all three models. That’s a welcome increase from the previous 25W cap, allowing them to juice up much faster in the same timeframe.</p><p>The Galaxy Z Fold 8 Ultra leads the pack, <strong>hitting 49% in 15 minutes and 76% in 30 minutes</strong>. That’s an impressive leap over the Z Fold 7’s 54% mark, even outstripping the Motorola Razr Fold’s 73%. The standard Z Fold 8 also impresses by reaching 70% in half an hour.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Charging Speed (in 15 minutes)</strong></p></td><td  ><p><strong>Charging Speed (in 30 minutes)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>35%</p></td><td  ><p>59%</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>29%</p></td><td  ><p>55%</p></td></tr><tr><td class="firstcol " ><p><strong>Razr Ultra (2026)</strong></p></td><td  ><p>42%</p></td><td  ><p>74%</p></td></tr></tbody></table></div><p>Meanwhile, the Z Flip 8 offers a slighter improvement over its predecessor, reaching 59% in 30 minutes compared to the Flip 7’s 55% — a surprisingly modest gain given the wattage upgrade. While that still trails the Motorola Razr Ultra’s blazing 74% charge result, Samsung’s entire 2026 lineup comfortably outpaces rivals like the Google Pixel 10 Pro Fold (58%), ensuring less time tethered to a wall adapter.</p><h2 class="article-body__section" id="section-galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-verdict"><span>Galaxy Z Fold 8 vs Fold 8 Ultra vs Flip 8: 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:4318px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PEQ4Xb5Gy5qwqg5NJJmYv" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/PEQ4Xb5Gy5qwqg5NJJmYv-1920-80.jpg" mos="" align="middle" fullscreen="" width="4318" height="2429" attribution="" endorsement="" class="inline"></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 weren’t convinced already, I’ll state it again: silicon-carbon batteries are making a massive impact — and Samsung’s new foldables cement my sentiment. Foldable phones have come a long way, and battery performance is no longer one of their compromises.</p><p>By introducing silicon-carbon battery technology alongside 45W wired charging, Samsung’s 2026 Galaxy Z lineup delivers meaningful upgrades where it matters most and makes them solid <a href="https://www.tomsguide.com/us/smartphones-best-battery-life,review-2857.html">best phone battery life </a>contenders. These improvements should translate to tangible real-world gains, powering you through a full workday without the constant need to top off.</p><p>While Motorola continues to push the upper boundaries of battery life with its Razr series, Samsung’s Galaxy Z Fold 8 Ultra stands out as the ultimate powerhouse, comfortably outlasting rivals like the Pixel 10 Pro Fold while charging faster than ever before. Whether you prefer a compact flip or an immersive book-style screen, you can finally enjoy foldable productivity without constantly watching your battery level.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-e47Y4X"></div>                            </div>                            <script src="https://kwizly.com/embed/e47Y4X.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/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">‘We're pretty confident': How Samsung plans to fight the first foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Galaxy Z Fold 8 vs Fold 8 Ultra vs Flip 8 benchmarked — the results are in ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung’s new foldables were announced at <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">Galaxy Unpacked</a>, and despite their vastly different form factors, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Z Fold 8</a>, and <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a> all share one crucial component: Qualcomm’s <a href="https://www.tomsguide.com/phones/android-phones/qualcomms-snapdragon-8-elite-gen-5-promises-big-performance-and-ai-upgrades-and-we-could-see-them-in-the-galaxy-s26-ultra">Snapdragon 8 Elite Gen 5 chip</a>.</p><p>That’s a big deal. Last year, Samsung opted for its in-house <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-launches-exynos-2500-just-ahead-of-unpacked-chip-rumored-to-power-galaxy-z-flip-7">Exynos 2500</a> chipset on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection">Z Flip 7</a> while saving Qualcomm’s flagship silicon for the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Z Fold 7</a>. This year’s rollout puts all three foldable contenders on even ground — and after putting them through a full suite of benchmark tests, I can tell you they’re easily the most powerful foldables to ever pass through the Tom’s Guide labs.</p><p>However, subtle performance variations between the three reveal which device actually reigns supreme. Here’s how the numbers break down.</p><div class="product"><a data-dimension112="86c3022e-87a6-11f1-a99c-29cf8f4aba64" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" 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="Z8JQhsbfoEz3hniEDEyqBV" name="Samsung Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Z8JQhsbfoEz3hniEDEyqBV-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="86c3022e-87a6-11f1-a99c-29cf8f4aba64" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8 hands-on</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but you get a greatly reduced crease, brighter main screen, and lighter design.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="86c3022e-87a6-11f1-a99c-29cf8f4aba64" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="86c302a6-87a6-11f1-b943-c9f803c3f9d4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2099.99" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J/" 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="XUkFwYXYpdYjL4TYYivxEg" name="Samsung Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XUkFwYXYpdYjL4TYYivxEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want the premier foldable, the Galaxy Z Fold 8 Ultra packs a larger 8-inch main display, a more robust triple camera, and a large 5,000 mAh battery capacity. For a limited time, Amazon is offering a free $350 Amazon gift card when you preorder your Galaxy Z Fold 8 Ultra.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J/" target="_blank" rel="nofollow" data-dimension112="86c302a6-87a6-11f1-b943-c9f803c3f9d4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2099.99">View Deal</a></p></div><div class="product"><a data-dimension112="86c3030a-87a6-11f1-ba9e-fda16b9a064b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1199px;"><p class="vanilla-image-block" style="padding-top:125.10%;"><img id="rTkAPNzBbP77RUVHtMufoZ" name="Galaxy Z Flip 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rTkAPNzBbP77RUVHtMufoZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1199" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="86c3030a-87a6-11f1-ba9e-fda16b9a064b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension25=""><strong>up to $1,200 off w/ trade-in + $200 gift card @ Best Buy</strong></a><br>Best Buy is offering one of the best Galaxy Z Flip 8 deals right now. This flip style phone might look the same, but it's actually thinner and lighter. Plus, it's packing some new features, like Horizon Lock when you shoot videos. Purchase your phone at Best Buy and you'll get up to $1,200 off via trade-in and a free $200 Best Buy gift card. <a class="view-deal button" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="86c3030a-87a6-11f1-ba9e-fda16b9a064b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-galaxy-z-flip-8-vs-fold-8-vs-fold-8-ultra-geekbench"><span>Galaxy Z Flip 8 vs Fold 8 vs Fold 8 Ultra: GeekBench</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>GeekBench 6 (single / multi-core)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>3,627 / 11,215</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>2,286 / 8,079</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>3,659 / 11,020</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>3,733 / 11,457</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>3,052 / 9,735</p></td></tr></tbody></table></div><p>When it comes to raw processing power, the Z Fold 8 Ultra leads the pack, breaking the 3,700 barrier in Geekbench 6.7 with an average single-core score of 3,733 and a multi-core score of 11,457.</p><p>A surprising trend emerges between the other two foldables. While the standard Galaxy Z Fold 8 posts a slightly higher single-core score (3,659), the compact Z Flip 8 actually outperforms it in multi-core performance, hitting 11,215 compared to the Fold 8’s 11,020.</p><div><blockquote><p>What’s really notable here is how the Z Flip 8 yields a massive 59% jump in single-core performance</p></blockquote></div><p>What’s really notable here is how the <strong>Z Flip 8 yields a massive 59% jump in single-core performance</strong> and an equally compelling 39% increase in multi-core power — starkly highlighting the gap between Samsung's previous Exynos silicon and the Snapdragon 8 Elite Gen 5.</p><p>While the generational leap isn’t quite as dramatic for the Z Fold 8 Ultra, it remains a marked improvement. Samsung's <strong>top-tier foldable still delivers a solid 22.3% boost in single-core power</strong> and a 17.7% bump in multi-core performance over the Fold 7.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>GeekBench 6 (single / multi-core)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Ultra (2026)</strong></p></td><td  ><p>2,886 / 8,982</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>2,711 / 9,134</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 10 Pro Fold</strong></p></td><td  ><p>2,344 / 6,332</p></td></tr></tbody></table></div><p>Against their biggest rivals, Samsung’s new foldables still come out on top hands down. The Z Flip 8 comfortably outperforms the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Razr Ultra (2026)</a> in Geekbench 6, boasting a superb 25.7% advantage in single-core speeds and a 24.9% lead in multi-core performance.</p><p>Meanwhile, the Z Fold 8 Ultra delivers 37.7% faster single-core and 25.4% higher multi-core output compared to the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Razr Fold</a>. The contrast is even starker against the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Google Pixel 10 Pro Fold</a>, where Samsung’s flagship foldable completely blows past Google’s offering with a 59.3% higher single-core score and an astonishing 80.9% lead in multi-core performance.</p><h2 class="article-body__section" id="section-galaxy-z-flip-8-vs-fold-8-vs-fold-8-ultra-3dmark"><span>Galaxy Z Flip 8 vs Fold 8 vs Fold 8 Ultra: 3DMark</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Wild Life Unlimited (score / FPS)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>29,723 / 177.9</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>19,144 / 114.64</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>26,608 / 165.3</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>30,980 / 185.51</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>20,529 / 123.83</p></td></tr></tbody></table></div><p>Out of the bunch, the Galaxy Z Fold 8 Ultra once again claims the top spot, breaking past the 30,000 threshold with a high score of 30,980 and an average frame rate of 185.51 fps. The latter is honestly mind boggling and shows the kind of graphic processing muscle power it’s packing.</p><p>The compact Galaxy Z Flip 8 delivers another impressive showing, taking second place with a score of 29,723 and 177.90 fps, outperforming the Galaxy Z Fold 8, which logged a score of 26,608 and 165.30 fps. While all three foldables deliver plenty of graphical muscle for mobile gaming, the Ultra and Flip 8 demonstrate a noticeable edge in peak rendering speeds for those who can’t afford a sliver of choppy gameplay.</p><p>Again, the biggest year-over-year improvement goes to the Z Flip 8, which achieves a 55.3% higher score and a 55.2% boost in average frame rate over the Z Flip 7. I can’t stress enough the immense graphical power boost it’s getting going from an Exynos to a Snapdragon.</p><p>As for the Z Fold 8 Ultra? It tells a similar story of dominant growth by delivering a 50.9% increase in overall score and a 49.8% jump in frame rate performance compared to the Z Fold 7. This, obviously, should result in gameplay being a lot smoother.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Wild Life Unlimited (score / FPS)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Ultra (2026)</strong></p></td><td  ><p>24437 / 146.33</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>21,580 / 129.23</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 10 Pro Fold</strong></p></td><td  ><p>13,306 / 79.68</p></td></tr></tbody></table></div><p>In the battle of the clamshells, the Z Flip 8 holds a commanding lead over its primary rival, the Motorola Razr Ultra (2026). In fact, Samsung's flip phone maintains a solid 21.6% advantage in both overall score and frame rate rendering.</p><p>Samsung’s dominance is even more pronounced in the book-style category, where the Galaxy Z Fold 8 Ultra delivers 43.6% higher graphical performance than the Razr Fold. That gap widens tremendously against the Pixel 10 Pro Fold, with the Z Fold 8 Ultra boasting a mind-boggling 132.8% lead over Google’s flagship foldable.</p><h2 class="article-body__section" id="section-galaxy-z-flip-8-vs-fold-8-vs-fold-8-ultra-verdict"><span>Galaxy Z Flip 8 vs Fold 8 vs Fold 8 Ultra: 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:2797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="jDQR6ZY2cx8T5NxgCddxW" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/jDQR6ZY2cx8T5NxgCddxW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2797" height="1573" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung’s decision to go all-in on Qualcomm’s Snapdragon 8 Elite Gen 5 silicon across its entire 2026 lineup pays off. All three foldables deliver generational leaps in raw CPU processing and peak graphical output.</p><p>However, if you want the absolute pinnacle of performance, the Galaxy Z Fold 8 Ultra reigns supreme — dominating every metric while outpacing rivals like the Pixel 10 Pro Fold and Motorola Razr Fold.</p><p>Meanwhile, the compact Galaxy Z Flip 8 emerges as the surprise hero of the bunch, proving that big things come in small packages. While the standard Galaxy Z Fold 8 remains a dependable workhorse, Samsung’s new devices aren't just incremental upgrades — they set a new benchmark for foldables.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYddRO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYddRO.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/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">‘We're pretty confident': How Samsung plans to fight the first foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-vs-fold-8-ultra-vs-flip-8-benchmarked-the-results-are-in</link>
                                                                            <description>
                            <![CDATA[ We benchmark Samsung’s new Galaxy Z Fold 8 Ultra, Z Fold 8, and Z Flip 8 to see how the Snapdragon 8 Elite Gen 5 performs against the competition. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">UDpKo9PbwXUMeioND3wrZT</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/8V5LZu98LotXf8VAQDiLu-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 20:00:38 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 21:27:52 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/8V5LZu98LotXf8VAQDiLu-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z 8 lineup.]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z 8 lineup.]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z 8 lineup.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/8V5LZu98LotXf8VAQDiLu-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung’s new foldables were announced at <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">Galaxy Unpacked</a>, and despite their vastly different form factors, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a>, <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Z Fold 8</a>, and <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a> all share one crucial component: Qualcomm’s <a href="https://www.tomsguide.com/phones/android-phones/qualcomms-snapdragon-8-elite-gen-5-promises-big-performance-and-ai-upgrades-and-we-could-see-them-in-the-galaxy-s26-ultra">Snapdragon 8 Elite Gen 5 chip</a>.</p><p>That’s a big deal. Last year, Samsung opted for its in-house <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-launches-exynos-2500-just-ahead-of-unpacked-chip-rumored-to-power-galaxy-z-flip-7">Exynos 2500</a> chipset on the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-7-hands-on-review-feels-like-flip-phone-perfection">Z Flip 7</a> while saving Qualcomm’s flagship silicon for the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Z Fold 7</a>. This year’s rollout puts all three foldable contenders on even ground — and after putting them through a full suite of benchmark tests, I can tell you they’re easily the most powerful foldables to ever pass through the Tom’s Guide labs.</p><p>However, subtle performance variations between the three reveal which device actually reigns supreme. Here’s how the numbers break down.</p><div class="product"><a data-dimension112="86c3022e-87a6-11f1-a99c-29cf8f4aba64" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" 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="Z8JQhsbfoEz3hniEDEyqBV" name="Samsung Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/Z8JQhsbfoEz3hniEDEyqBV-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="86c3022e-87a6-11f1-a99c-29cf8f4aba64" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $1,200 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $1,200 off Galaxy Z Fold 8 preorders when you trade-in an older phone. Alternatively, you'll get a $200 credit if you don't have a trade-in. The phone features an 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite CPU, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8 hands-on</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but you get a greatly reduced crease, brighter main screen, and lighter design.<a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-fold8/buy/galaxy-z-fold8-256gb-unlocked-sku-sm-f971ulvaxaa/" target="_blank" rel="nofollow" data-dimension112="86c3022e-87a6-11f1-a99c-29cf8f4aba64" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Fold 8 preorder: up to $1,200 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="86c302a6-87a6-11f1-b943-c9f803c3f9d4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2099.99" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J/" 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="XUkFwYXYpdYjL4TYYivxEg" name="Samsung Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/XUkFwYXYpdYjL4TYYivxEg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>If you want the premier foldable, the Galaxy Z Fold 8 Ultra packs a larger 8-inch main display, a more robust triple camera, and a large 5,000 mAh battery capacity. For a limited time, Amazon is offering a free $350 Amazon gift card when you preorder your Galaxy Z Fold 8 Ultra.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12DXK8J/" target="_blank" rel="nofollow" data-dimension112="86c302a6-87a6-11f1-b943-c9f803c3f9d4" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra" data-dimension48="Galaxy Z Fold 8 Ultra" data-dimension25="$2099.99">View Deal</a></p></div><div class="product"><a data-dimension112="86c3030a-87a6-11f1-ba9e-fda16b9a064b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1199px;"><p class="vanilla-image-block" style="padding-top:125.10%;"><img id="rTkAPNzBbP77RUVHtMufoZ" name="Galaxy Z Flip 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rTkAPNzBbP77RUVHtMufoZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1199" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="86c3030a-87a6-11f1-ba9e-fda16b9a064b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension25=""><strong>up to $1,200 off w/ trade-in + $200 gift card @ Best Buy</strong></a><br>Best Buy is offering one of the best Galaxy Z Flip 8 deals right now. This flip style phone might look the same, but it's actually thinner and lighter. Plus, it's packing some new features, like Horizon Lock when you shoot videos. Purchase your phone at Best Buy and you'll get up to $1,200 off via trade-in and a free $200 Best Buy gift card. <a class="view-deal button" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="86c3030a-87a6-11f1-ba9e-fda16b9a064b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension25="">View Deal</a></p></div><h2 class="article-body__section" id="section-galaxy-z-flip-8-vs-fold-8-vs-fold-8-ultra-geekbench"><span>Galaxy Z Flip 8 vs Fold 8 vs Fold 8 Ultra: GeekBench</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>GeekBench 6 (single / multi-core)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>3,627 / 11,215</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>2,286 / 8,079</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>3,659 / 11,020</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>3,733 / 11,457</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>3,052 / 9,735</p></td></tr></tbody></table></div><p>When it comes to raw processing power, the Z Fold 8 Ultra leads the pack, breaking the 3,700 barrier in Geekbench 6.7 with an average single-core score of 3,733 and a multi-core score of 11,457.</p><p>A surprising trend emerges between the other two foldables. While the standard Galaxy Z Fold 8 posts a slightly higher single-core score (3,659), the compact Z Flip 8 actually outperforms it in multi-core performance, hitting 11,215 compared to the Fold 8’s 11,020.</p><div><blockquote><p>What’s really notable here is how the Z Flip 8 yields a massive 59% jump in single-core performance</p></blockquote></div><p>What’s really notable here is how the <strong>Z Flip 8 yields a massive 59% jump in single-core performance</strong> and an equally compelling 39% increase in multi-core power — starkly highlighting the gap between Samsung's previous Exynos silicon and the Snapdragon 8 Elite Gen 5.</p><p>While the generational leap isn’t quite as dramatic for the Z Fold 8 Ultra, it remains a marked improvement. Samsung's <strong>top-tier foldable still delivers a solid 22.3% boost in single-core power</strong> and a 17.7% bump in multi-core performance over the Fold 7.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>GeekBench 6 (single / multi-core)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Ultra (2026)</strong></p></td><td  ><p>2,886 / 8,982</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>2,711 / 9,134</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 10 Pro Fold</strong></p></td><td  ><p>2,344 / 6,332</p></td></tr></tbody></table></div><p>Against their biggest rivals, Samsung’s new foldables still come out on top hands down. The Z Flip 8 comfortably outperforms the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-ultra-2026-review">Razr Ultra (2026)</a> in Geekbench 6, boasting a superb 25.7% advantage in single-core speeds and a 24.9% lead in multi-core performance.</p><p>Meanwhile, the Z Fold 8 Ultra delivers 37.7% faster single-core and 25.4% higher multi-core output compared to the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Razr Fold</a>. The contrast is even starker against the <a href="https://www.tomsguide.com/phones/google-pixel-phones/pixel-10-pro-fold-review">Google Pixel 10 Pro Fold</a>, where Samsung’s flagship foldable completely blows past Google’s offering with a 59.3% higher single-core score and an astonishing 80.9% lead in multi-core performance.</p><h2 class="article-body__section" id="section-galaxy-z-flip-8-vs-fold-8-vs-fold-8-ultra-3dmark"><span>Galaxy Z Flip 8 vs Fold 8 vs Fold 8 Ultra: 3DMark</span></h2><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Wild Life Unlimited (score / FPS)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 8</strong></p></td><td  ><p>29,723 / 177.9</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Flip 7</strong></p></td><td  ><p>19,144 / 114.64</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8</strong></p></td><td  ><p>26,608 / 165.3</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 8 Ultra</strong></p></td><td  ><p>30,980 / 185.51</p></td></tr><tr><td class="firstcol " ><p><strong>Galaxy Z Fold 7</strong></p></td><td  ><p>20,529 / 123.83</p></td></tr></tbody></table></div><p>Out of the bunch, the Galaxy Z Fold 8 Ultra once again claims the top spot, breaking past the 30,000 threshold with a high score of 30,980 and an average frame rate of 185.51 fps. The latter is honestly mind boggling and shows the kind of graphic processing muscle power it’s packing.</p><p>The compact Galaxy Z Flip 8 delivers another impressive showing, taking second place with a score of 29,723 and 177.90 fps, outperforming the Galaxy Z Fold 8, which logged a score of 26,608 and 165.30 fps. While all three foldables deliver plenty of graphical muscle for mobile gaming, the Ultra and Flip 8 demonstrate a noticeable edge in peak rendering speeds for those who can’t afford a sliver of choppy gameplay.</p><p>Again, the biggest year-over-year improvement goes to the Z Flip 8, which achieves a 55.3% higher score and a 55.2% boost in average frame rate over the Z Flip 7. I can’t stress enough the immense graphical power boost it’s getting going from an Exynos to a Snapdragon.</p><p>As for the Z Fold 8 Ultra? It tells a similar story of dominant growth by delivering a 50.9% increase in overall score and a 49.8% jump in frame rate performance compared to the Z Fold 7. This, obviously, should result in gameplay being a lot smoother.</p><div ><table><tbody><tr><td class="firstcol empty" ></td><td  ><p><strong>Wild Life Unlimited (score / FPS)</strong></p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Ultra (2026)</strong></p></td><td  ><p>24437 / 146.33</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Fold</strong></p></td><td  ><p>21,580 / 129.23</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 10 Pro Fold</strong></p></td><td  ><p>13,306 / 79.68</p></td></tr></tbody></table></div><p>In the battle of the clamshells, the Z Flip 8 holds a commanding lead over its primary rival, the Motorola Razr Ultra (2026). In fact, Samsung's flip phone maintains a solid 21.6% advantage in both overall score and frame rate rendering.</p><p>Samsung’s dominance is even more pronounced in the book-style category, where the Galaxy Z Fold 8 Ultra delivers 43.6% higher graphical performance than the Razr Fold. That gap widens tremendously against the Pixel 10 Pro Fold, with the Z Fold 8 Ultra boasting a mind-boggling 132.8% lead over Google’s flagship foldable.</p><h2 class="article-body__section" id="section-galaxy-z-flip-8-vs-fold-8-vs-fold-8-ultra-verdict"><span>Galaxy Z Flip 8 vs Fold 8 vs Fold 8 Ultra: 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:2797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="jDQR6ZY2cx8T5NxgCddxW" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/jDQR6ZY2cx8T5NxgCddxW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2797" height="1573" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Samsung’s decision to go all-in on Qualcomm’s Snapdragon 8 Elite Gen 5 silicon across its entire 2026 lineup pays off. All three foldables deliver generational leaps in raw CPU processing and peak graphical output.</p><p>However, if you want the absolute pinnacle of performance, the Galaxy Z Fold 8 Ultra reigns supreme — dominating every metric while outpacing rivals like the Pixel 10 Pro Fold and Motorola Razr Fold.</p><p>Meanwhile, the compact Galaxy Z Flip 8 emerges as the surprise hero of the bunch, proving that big things come in small packages. While the standard Galaxy Z Fold 8 remains a dependable workhorse, Samsung’s new devices aren't just incremental upgrades — they set a new benchmark for foldables.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XYddRO"></div>                            </div>                            <script src="https://kwizly.com/embed/XYddRO.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/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">‘We're pretty confident': How Samsung plans to fight the first foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best Samsung Galaxy Z Flip 8 cases to shield your new foldable — from $19 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung's new wave of foldable smartphones has officially been revealed. As well as the <a href="https://www.tomsguide.com/phones/samsung-phones/9-best-samsung-galaxy-z-fold-8-and-fold-8-ultra-cases-to-protect-your-new-smartphone-from-usd19">Galaxy Z Fold 8 and Fold 8 Ultra</a>, the brand is launching the new Galaxy Z Flip 8 — a compact and lightweight AI-powered flip phone that's packed with features.</p><p>If you're excited for the Flip 8's release on August 7 then you may want to prepare by picking up a protective case now – after all, you're going to want to keep your new foldable in great condition for as long as possible. </p><p>I've picked out nine of my favorites below, including some official Samsung ones and a few by third party brands. Prices start at just $19, so there's a case here for every budget and some fun designs and colors to choose from.</p>        <div class="featured_product_block featured_block_hero" data-id="222486d6-86a1-11f1-9978-8f2ce4bed7a4">            <a href="https://www.amazon.com/FNTCASE-Samsung-Galaxy-Flip-Case/dp/B0GYXRWLB2/" data-model-name="Fntcase for Samsung Galaxy Z Flip 8" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/2QSu6GSAPH3mkQdZRb3Pua.jpg" alt="Fntcase for Samsung Galaxy Z Flip 8 Case: [hinge Protection + Screen Protector] [fit for Magsafe] Military Grade Drop Proof, Translucent Matte Protective Phone Cover - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>FNTCASE</div>                                        <div class="featured__title">Fntcase for Samsung Galaxy Z Flip 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="2224874e-86a1-11f1-948d-6ff9f59c0a2e">            <a href="https://www.spigen.com/products/galaxy-z-flip-8-series-glas-tr-ez-fit?variant=45515045371951" data-model-name="Spigen Glas.tr Ez Fit case for Galaxy Z Flip 8" 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/EdQurdfvhBhH6zRvpLn3Bb.jpg" alt="Galaxy Z Flip 8 Series - Glas.tr Ez Fit"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Spigen</div>                                        <div class="featured__title">Spigen Glas.tr Ez Fit case for Galaxy Z Flip 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="222488a2-86a1-11f1-afca-cd95c00fa932">            <a href="https://www.spigen.com/products/galaxy-z-flip-8-series-core-armor-mag-fit?variant=45515222908975" data-model-name="Spigen Galaxy Z Flip 8 Core Armor case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.93%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/srxutiLo6FStUHzCbMHrSh.jpg" alt="Spigen, Spigen Galaxy Z Flip 8 Core Armor case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Spigen</div>                                        <div class="featured__title">Spigen Galaxy Z Flip 8 Core Armor case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="22248910-86a1-11f1-be1d-b3ddec5b71c3">            <a href="https://www.amazon.com/Spigen-Ultra-Hybrid-MagFit-Galaxy/dp/B0GKQFH9VG/" data-model-name="Spigen Ultra Hybrid Pro Magfit case for Galaxy Z Flip 8" 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/XAh38pJHcvSaCX7iF4Hy4c.jpg" alt="Spigen Ultra Hybrid Pro Magfit for Galaxy Z Flip 8 Case, Clear White"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Spigen</div>                                        <div class="featured__title">Spigen Ultra Hybrid Pro Magfit case for Galaxy Z Flip 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="222487bc-86a1-11f1-a534-538c277bf838">            <a href="https://www.samsung.com/us/mobile-accessories/phones/galaxy-z-flip8-flipsuit-case-silver-sku-ef-ff776cjegus/" data-model-name="Galaxy Z Flip8 Flipsuit Case, Silver" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/S8M9B844EKTjUghPm8HefC.jpg" alt="Samsung, Galaxy Z Flip8 Flipsuit Case, Silver"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Galaxy Z Flip8 Flipsuit Case, Silver</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="22248a64-86a1-11f1-9f59-0590fef549dd">            <a href="https://new.ipitaka.com/products/sunset-moonrise-phone-cases?variant=43625602187334" data-model-name="Sunset Moonrise Phone Cases - Samsung Galaxy Z Flip7 / Moonrise | Edge Case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/jUTqYFtsbQzjYJXgrGHE6Z.jpg" alt="Pitaka Moment Moonrise Galaxy Z Flip 8 case."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>PITAKA</div>                                        <div class="featured__title">Sunset Moonrise Phone Cases - Samsung Galaxy Z Flip7 / Moonrise | Edge Case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="22248988-86a1-11f1-8659-c7a842e1e13c">            <a href="https://www.samsung.com/us/mobile-accessories/phones/galaxy-z-flip8-silicone-ring-magnet-case-pink-sku-ef-ef776cvegus/" data-model-name="Samsung Galaxy Z Flip 8 Silicone Ring Magnet case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/vCHjm97CSr6WDv8fr3gUDa.jpg" alt="Samsung, Samsung Galaxy Z Flip 8 Silicone Ring Magnet case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Z Flip 8 Silicone Ring Magnet case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="222489f6-86a1-11f1-a46d-a13ab2afd500">            <a href="https://www.amazon.com/pitaka-Caseless-Touch-Feeling-Sunset/dp/B0H5VLK3C7/" data-model-name="Pitaka for Z Flip 8 Sunset case" 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/4sTg8YiLaoeDkNRBW2zEhc.jpg" alt="Pitaka for Z Flip 8 Case, Caseless Touch Feeling, Sunset"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Pitaka</div>                                        <div class="featured__title">Pitaka for Z Flip 8 Sunset case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="2224882a-86a1-11f1-b995-ff835c77d9b2">            <a href="https://www.samsung.com/us/mobile-accessories/phones/galaxy-z-flip8-mirror-magnet-case-pinggu-black-sku-gp-fpf776hicbu/" data-model-name="Samsung Galaxy Z Flip 8 Pingu Mirror Magnet Case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/6YbZzAP6TRHAJRHfTjSrrW.jpg" alt="Samsung, Samsung Galaxy Z Flip 8 Pingu Mirror Magnet Case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Z Flip 8 Pingu Mirror Magnet Case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/best-samsung-galaxy-z-flip-8-cases-to-shield-your-new-foldable-from-usd19</link>
                                                                            <description>
                            <![CDATA[ Samsung's Galaxy Z Flip 8 smartphone is officially on its way. Here are nine durable cases from Samsung and other brands to keep it safe and clean. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">M7dv3oYE63BJPHMBVAn46T</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/Jkgfu3aZXtKkhn9dbxn7Vh-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 13:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Will Salmon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/HpRWP7Mh9ErgRGoTvZBbBJ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Will Salmon is Tom&#039;s Guide&#039;s Collections Editor, curating advice on the best products to spend your money on. Will has been writing about tech and entertainment for almost 20 years, including stints as GamesRadar+&#039;s Streaming Editor, editing comics website Newsarama, and writing for lots and lots of magazines.&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/Jkgfu3aZXtKkhn9dbxn7Vh-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of Galaxy Z Flip 8 cases.]]></media:description>                                                            <media:text><![CDATA[A selection of Galaxy Z Flip 8 cases.]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of Galaxy Z Flip 8 cases.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/Jkgfu3aZXtKkhn9dbxn7Vh-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung's new wave of foldable smartphones has officially been revealed. As well as the <a href="https://www.tomsguide.com/phones/samsung-phones/9-best-samsung-galaxy-z-fold-8-and-fold-8-ultra-cases-to-protect-your-new-smartphone-from-usd19">Galaxy Z Fold 8 and Fold 8 Ultra</a>, the brand is launching the new Galaxy Z Flip 8 — a compact and lightweight AI-powered flip phone that's packed with features.</p><p>If you're excited for the Flip 8's release on August 7 then you may want to prepare by picking up a protective case now – after all, you're going to want to keep your new foldable in great condition for as long as possible. </p><p>I've picked out nine of my favorites below, including some official Samsung ones and a few by third party brands. Prices start at just $19, so there's a case here for every budget and some fun designs and colors to choose from.</p>        <div class="featured_product_block featured_block_hero" data-id="222486d6-86a1-11f1-9978-8f2ce4bed7a4">            <a href="https://www.amazon.com/FNTCASE-Samsung-Galaxy-Flip-Case/dp/B0GYXRWLB2/" data-model-name="Fntcase for Samsung Galaxy Z Flip 8" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:99.00%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/2QSu6GSAPH3mkQdZRb3Pua.jpg" alt="Fntcase for Samsung Galaxy Z Flip 8 Case: [hinge Protection + Screen Protector] [fit for Magsafe] Military Grade Drop Proof, Translucent Matte Protective Phone Cover - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>FNTCASE</div>                                        <div class="featured__title">Fntcase for Samsung Galaxy Z Flip 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="2224874e-86a1-11f1-948d-6ff9f59c0a2e">            <a href="https://www.spigen.com/products/galaxy-z-flip-8-series-glas-tr-ez-fit?variant=45515045371951" data-model-name="Spigen Glas.tr Ez Fit case for Galaxy Z Flip 8" 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/EdQurdfvhBhH6zRvpLn3Bb.jpg" alt="Galaxy Z Flip 8 Series - Glas.tr Ez Fit"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Spigen</div>                                        <div class="featured__title">Spigen Glas.tr Ez Fit case for Galaxy Z Flip 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="222488a2-86a1-11f1-afca-cd95c00fa932">            <a href="https://www.spigen.com/products/galaxy-z-flip-8-series-core-armor-mag-fit?variant=45515222908975" data-model-name="Spigen Galaxy Z Flip 8 Core Armor case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.93%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/srxutiLo6FStUHzCbMHrSh.jpg" alt="Spigen, Spigen Galaxy Z Flip 8 Core Armor case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Spigen</div>                                        <div class="featured__title">Spigen Galaxy Z Flip 8 Core Armor case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="22248910-86a1-11f1-be1d-b3ddec5b71c3">            <a href="https://www.amazon.com/Spigen-Ultra-Hybrid-MagFit-Galaxy/dp/B0GKQFH9VG/" data-model-name="Spigen Ultra Hybrid Pro Magfit case for Galaxy Z Flip 8" 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/XAh38pJHcvSaCX7iF4Hy4c.jpg" alt="Spigen Ultra Hybrid Pro Magfit for Galaxy Z Flip 8 Case, Clear White"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Spigen</div>                                        <div class="featured__title">Spigen Ultra Hybrid Pro Magfit case for Galaxy Z Flip 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="222487bc-86a1-11f1-a534-538c277bf838">            <a href="https://www.samsung.com/us/mobile-accessories/phones/galaxy-z-flip8-flipsuit-case-silver-sku-ef-ff776cjegus/" data-model-name="Galaxy Z Flip8 Flipsuit Case, Silver" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/S8M9B844EKTjUghPm8HefC.jpg" alt="Samsung, Galaxy Z Flip8 Flipsuit Case, Silver"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Galaxy Z Flip8 Flipsuit Case, Silver</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="22248a64-86a1-11f1-9f59-0590fef549dd">            <a href="https://new.ipitaka.com/products/sunset-moonrise-phone-cases?variant=43625602187334" data-model-name="Sunset Moonrise Phone Cases - Samsung Galaxy Z Flip7 / Moonrise | Edge Case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/jUTqYFtsbQzjYJXgrGHE6Z.jpg" alt="Pitaka Moment Moonrise Galaxy Z Flip 8 case."></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>PITAKA</div>                                        <div class="featured__title">Sunset Moonrise Phone Cases - Samsung Galaxy Z Flip7 / Moonrise | Edge Case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="22248988-86a1-11f1-8659-c7a842e1e13c">            <a href="https://www.samsung.com/us/mobile-accessories/phones/galaxy-z-flip8-silicone-ring-magnet-case-pink-sku-ef-ef776cvegus/" data-model-name="Samsung Galaxy Z Flip 8 Silicone Ring Magnet case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/vCHjm97CSr6WDv8fr3gUDa.jpg" alt="Samsung, Samsung Galaxy Z Flip 8 Silicone Ring Magnet case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Z Flip 8 Silicone Ring Magnet case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="222489f6-86a1-11f1-a46d-a13ab2afd500">            <a href="https://www.amazon.com/pitaka-Caseless-Touch-Feeling-Sunset/dp/B0H5VLK3C7/" data-model-name="Pitaka for Z Flip 8 Sunset case" 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/4sTg8YiLaoeDkNRBW2zEhc.jpg" alt="Pitaka for Z Flip 8 Case, Caseless Touch Feeling, Sunset"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Pitaka</div>                                        <div class="featured__title">Pitaka for Z Flip 8 Sunset case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="2224882a-86a1-11f1-b995-ff835c77d9b2">            <a href="https://www.samsung.com/us/mobile-accessories/phones/galaxy-z-flip8-mirror-magnet-case-pinggu-black-sku-gp-fpf776hicbu/" data-model-name="Samsung Galaxy Z Flip 8 Pingu Mirror Magnet Case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/6YbZzAP6TRHAJRHfTjSrrW.jpg" alt="Samsung, Samsung Galaxy Z Flip 8 Pingu Mirror Magnet Case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Z Flip 8 Pingu Mirror Magnet Case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ My first 36 hours with the Samsung Galaxy Z Fold 8: I was wrong about the passport screen (but that $1,899 price still stings) ]]></title>
                                                                                                <dc:content><![CDATA[ <p>You may have seen that Samsung showed me all of its <a href="https://www.tomsguide.com/phones/samsung-phones/i-held-samsungs-secret-canceled-z-fold-8-prototypes-and-they-killed-the-best-one">canceled prototypes of the Galaxy Z Fold 8</a>. That moment combined with my time flying to China and checking out this <a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">future of passport foldables that the iPhone Ultra</a> looks set to adopt made me nervous that this stubbier size isn’t quite right.</p><p>But after my first 36 hours with the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Z Fold 8</a>, I’m coming around to the idea of this aspect ratio choice. Maybe the weight of my previous experiences clouded my judgement, but now out in the real world, it’s starting to click and make sense. </p><p>Throw in a strong camera, good battery life and beasty internals, and this has been a great first day of using Samsung’s new blower. I’ve seen a bunch of questions and thoughts in our comments, so these 24 hours have been more focused on answering these.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="what-s-the-aspect-ratio-like">What’s the aspect ratio like?</h2><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="9twLgAps2V4aAgB93fMayR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/9twLgAps2V4aAgB93fMayR-1920-80.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>We’ve been used to taller foldables that open out to a much more squared-off display for years now. Of course, other companies have tried the squished form factor like this, but this is Samsung’s first stab at it.</p><p>And honestly? At first I was feeling weird about it. Don’t get me wrong here, the smaller design does feel great to hold, and the one-handed operation feels like a blast from the past when small phones were cool.</p><p>That being said, the aspect ratio choice made here is a tough one to make — forming an awkward balance that black bars vertical content on the outside screen, as well as landscape on that 4:3 screen on the inside. Given the way “<a href="https://www.tomsguide.com/entertainment/movies/the-odyssey-review">The Odyssey</a>” is filmed in 70mm IMAX, this phone must be Christopher Nolan’s dream come true.</p><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="pY2CmKMLZLmC2oGDYKPT7S" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/pY2CmKMLZLmC2oGDYKPT7S-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But compared to the square of the Ultra, the size of content on this phone is <strong>much </strong>better. Catching up on Netflix is a joy on this screen, though the audio sounds a bit lop-sided when both speakers are on the left side, so headphones are a must.</p><p>And when it comes to getting stuff done, of course the Ultra is more angled towards that, but flipping this into a portrait 3:4 ratio is great for this specific job. Samsung worked on the software to optimize the keyboard for typing away, while the extra height does give you a lot of real estate for multi-tasking. </p><p>Also, big screen TikTok is fun, web browsing feels much better with this vertical canvas, and I now have a foldable Kindle in my pocket. Pretty sweet!</p><h2 id="is-the-crease-visible">Is the crease visible?</h2><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="6bxGdiam3BDqcSojZNdkyR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/6bxGdiam3BDqcSojZNdkyR-1920-80.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>Samsung made a whole thing about the use of a <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">titanium alloy film</a> atop the inside screen and titanium plate beneath it — with the mission being to improve durability and eliminate the crease.</p><p>Now, does it eliminate it? No. It’s a lot better than it has been before, but at certain angles with the light bouncing off it, you can see the outline of it. But you have to be <em>very </em>specific about it to see the thing.</p><p>Also, shout-out to that anti-reflective coating. Of course, the naming of it may feel a little misleading when you still see reflections bounce off of it. However, there is a noticeable reduction in the glare, and light sources have been dimmed quite a bit by whatever the coating is doing here.</p><h2 id="zippy-and-long-lasting">Zippy and long-lasting</h2><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="ouPQLdrqRKCXrqcAc6vDuR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/ouPQLdrqRKCXrqcAc6vDuR-1920-80.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>With Snapdragon 8 Elite Gen 5 for Galaxy inside with 12GB RAM does keep things nice and spritely under multitasking pressures for sure. And now that we’ve had these benchmarked in the lab, you can see this reflected in the numbers too.</p><div ><table><thead><tr><th class="firstcol " ><p>Phone</p></th><th  ><p>Geekbench 6 single-core</p></th><th  ><p>Geekbench 6 multicore</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Samsung Galaxy Z Fold 8</strong></p></td><td  ><p>3603</p></td><td  ><p>10949</p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 Ultra</strong></p></td><td  ><p>3785</p></td><td  ><p>11563</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>3871</p></td><td  ><p>9968</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Ultra</strong></p></td><td  ><p>2886</p></td><td  ><p>8982</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 10 Pro Fold</strong></p></td><td  ><p>2334</p></td><td  ><p>6332</p></td></tr></tbody></table></div><p>That single-core speed especially manifests itself in a snappy, responsive UI and opening apps at breakneck speeds, while the multicore comes into effect when I’m hopping between apps running in the background.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3919px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="i9cFmSQeutRkXafFNF5UTX" name="Galaxy Z Fold 8-LIST2" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/i9cFmSQeutRkXafFNF5UTX-1920-80.jpg" mos="" align="middle" fullscreen="" width="3919" height="2204" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then there’s the battery — a 4,800 mAh cell that embraces silicon carbon battery tech to add a little more juice while keeping it thin and light. In our lab testing, we’ve been able to get 12 hours and 20 minutes out of it on one charge.</p><p>In real-life, I’ve been able to get through an entire day of standard use with no real worries. Starting from 100%:</p><ul><li><strong>Two hours at the gym with music playing and regular screen opening to read news between sets: </strong>Battery went down to 92%</li><li><strong>Two hours on the phone with my wife — visiting websites on inside screen to finalize wedding celebration plans: </strong>Battery went down to 84%</li><li><strong>TikTok wormhole on inside screen for an hour: </strong>Battery went down to 79%</li><li><strong>Photography trip around London, multitasking between messaging apps, TikTok on the Underground, a couple phone calls, web browsing, and taking many photos: </strong>Battery went down to 64%</li></ul><p>By the time I got to the Nvidia afterparty at 10pm, the battery was at around 50%. Of course, if I’m more sparing with my use, you can make this run much longer. But it’s clear you’re getting all-day usage with no problems.</p><h2 id="snap-happy">Snap happy</h2><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="oamV7tYGgYvikv5tkwbSFS" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/oamV7tYGgYvikv5tkwbSFS-1920-80.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 always have a beef with Samsung about its camera science. The hardware is always good, but coming from being an iPhone user, the focus on vividity always makes me feel like the phones of old have just vomited color all over the screen.</p><p>Not anymore. These dual 50MP shooters are <strong>impressive</strong>. Detail preservation is good and while color balance does lean towards the warmer tones, they’re not as distractingly vivid as before — keeping natural skin tones looking realistic.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/29iQeBJUpQQUAbSetehJpS-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/PGxQecLCXiBnVC3CQjqQfS-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QNP5MEL6HrDsn53sTA8JSS-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>And shout-out to night time photography too. I know Samsung made a whole song and dance about Nightography with the Ultra’s 200MP lens, but you’re getting more than enough of that experience with a quarter of the megapixels here.</p><h2 id="outlook-2">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gW5R8PkMJxqWV74zHBrCpR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/gW5R8PkMJxqWV74zHBrCpR-1920-80.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>This is the first foldable I’ve properly daily driven. I have tested others in the past of course, but this is my first concerted effort to ditch a candy bar and give folds a chance. And after my first day and a half, I get the attraction to it.</p><p>There was a part of me that feared this would be a pure gimmick. And to many of you reading this, chances are it will be. You’ve got to have very specific use cases on lock to make the most of this — the work and content needs for that bigger screen if you’re always on-the-go.</p><p>If you have them, this more easily pocketable foldable is a real conversation starter, and a genuinely nice form factor. My only real problem is that $1,899 price tag. It’s massive to say the least! You can feel the premium nature of this phone, but that’s a huge cost to put on people. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/id-buy-a-galaxy-z-fold-8-over-the-z-fold-8-ultra-and-its-all-because-it-steals-this-z-trifold-feature">I'd buy a Galaxy Z Fold 8 over the Z Fold 8 Ultra — and it's all because it steals this Z TriFold feature</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/my-first-36-hours-with-the-samsung-galaxy-z-fold-8-i-was-wrong-about-the-passport-screen-but-that-usd1-899-price-still-stings</link>
                                                                            <description>
                            <![CDATA[ I spent 36 hours with the new Samsung Galaxy Z Fold 8. Here is why the new passport display, Flex Titanium crease, and battery life won me over. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jmy3pUQsyZxCmkqHWbv4Tc</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/9o3ZXWLLHpwvgcvMCvDJ7V-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 09:58:13 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 11:48:50 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/9o3ZXWLLHpwvgcvMCvDJ7V-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 in hand showing cover display against a wall with graffiti]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 in hand showing cover display against a wall with graffiti]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 in hand showing cover display against a wall with graffiti]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/9o3ZXWLLHpwvgcvMCvDJ7V-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>You may have seen that Samsung showed me all of its <a href="https://www.tomsguide.com/phones/samsung-phones/i-held-samsungs-secret-canceled-z-fold-8-prototypes-and-they-killed-the-best-one">canceled prototypes of the Galaxy Z Fold 8</a>. That moment combined with my time flying to China and checking out this <a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">future of passport foldables that the iPhone Ultra</a> looks set to adopt made me nervous that this stubbier size isn’t quite right.</p><p>But after my first 36 hours with the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Z Fold 8</a>, I’m coming around to the idea of this aspect ratio choice. Maybe the weight of my previous experiences clouded my judgement, but now out in the real world, it’s starting to click and make sense. </p><p>Throw in a strong camera, good battery life and beasty internals, and this has been a great first day of using Samsung’s new blower. I’ve seen a bunch of questions and thoughts in our comments, so these 24 hours have been more focused on answering these.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="what-s-the-aspect-ratio-like">What’s the aspect ratio like?</h2><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="9twLgAps2V4aAgB93fMayR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/9twLgAps2V4aAgB93fMayR-1920-80.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>We’ve been used to taller foldables that open out to a much more squared-off display for years now. Of course, other companies have tried the squished form factor like this, but this is Samsung’s first stab at it.</p><p>And honestly? At first I was feeling weird about it. Don’t get me wrong here, the smaller design does feel great to hold, and the one-handed operation feels like a blast from the past when small phones were cool.</p><p>That being said, the aspect ratio choice made here is a tough one to make — forming an awkward balance that black bars vertical content on the outside screen, as well as landscape on that 4:3 screen on the inside. Given the way “<a href="https://www.tomsguide.com/entertainment/movies/the-odyssey-review">The Odyssey</a>” is filmed in 70mm IMAX, this phone must be Christopher Nolan’s dream come true.</p><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="pY2CmKMLZLmC2oGDYKPT7S" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/pY2CmKMLZLmC2oGDYKPT7S-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But compared to the square of the Ultra, the size of content on this phone is <strong>much </strong>better. Catching up on Netflix is a joy on this screen, though the audio sounds a bit lop-sided when both speakers are on the left side, so headphones are a must.</p><p>And when it comes to getting stuff done, of course the Ultra is more angled towards that, but flipping this into a portrait 3:4 ratio is great for this specific job. Samsung worked on the software to optimize the keyboard for typing away, while the extra height does give you a lot of real estate for multi-tasking. </p><p>Also, big screen TikTok is fun, web browsing feels much better with this vertical canvas, and I now have a foldable Kindle in my pocket. Pretty sweet!</p><h2 id="is-the-crease-visible">Is the crease visible?</h2><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="6bxGdiam3BDqcSojZNdkyR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/6bxGdiam3BDqcSojZNdkyR-1920-80.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>Samsung made a whole thing about the use of a <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">titanium alloy film</a> atop the inside screen and titanium plate beneath it — with the mission being to improve durability and eliminate the crease.</p><p>Now, does it eliminate it? No. It’s a lot better than it has been before, but at certain angles with the light bouncing off it, you can see the outline of it. But you have to be <em>very </em>specific about it to see the thing.</p><p>Also, shout-out to that anti-reflective coating. Of course, the naming of it may feel a little misleading when you still see reflections bounce off of it. However, there is a noticeable reduction in the glare, and light sources have been dimmed quite a bit by whatever the coating is doing here.</p><h2 id="zippy-and-long-lasting">Zippy and long-lasting</h2><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="ouPQLdrqRKCXrqcAc6vDuR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/ouPQLdrqRKCXrqcAc6vDuR-1920-80.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>With Snapdragon 8 Elite Gen 5 for Galaxy inside with 12GB RAM does keep things nice and spritely under multitasking pressures for sure. And now that we’ve had these benchmarked in the lab, you can see this reflected in the numbers too.</p><div ><table><thead><tr><th class="firstcol " ><p>Phone</p></th><th  ><p>Geekbench 6 single-core</p></th><th  ><p>Geekbench 6 multicore</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Samsung Galaxy Z Fold 8</strong></p></td><td  ><p>3603</p></td><td  ><p>10949</p></td></tr><tr><td class="firstcol " ><p><strong>Samsung Galaxy S26 Ultra</strong></p></td><td  ><p>3785</p></td><td  ><p>11563</p></td></tr><tr><td class="firstcol " ><p><strong>iPhone 17 Pro Max</strong></p></td><td  ><p>3871</p></td><td  ><p>9968</p></td></tr><tr><td class="firstcol " ><p><strong>Motorola Razr Ultra</strong></p></td><td  ><p>2886</p></td><td  ><p>8982</p></td></tr><tr><td class="firstcol " ><p><strong>Google Pixel 10 Pro Fold</strong></p></td><td  ><p>2334</p></td><td  ><p>6332</p></td></tr></tbody></table></div><p>That single-core speed especially manifests itself in a snappy, responsive UI and opening apps at breakneck speeds, while the multicore comes into effect when I’m hopping between apps running in the background.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3919px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="i9cFmSQeutRkXafFNF5UTX" name="Galaxy Z Fold 8-LIST2" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/i9cFmSQeutRkXafFNF5UTX-1920-80.jpg" mos="" align="middle" fullscreen="" width="3919" height="2204" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Then there’s the battery — a 4,800 mAh cell that embraces silicon carbon battery tech to add a little more juice while keeping it thin and light. In our lab testing, we’ve been able to get 12 hours and 20 minutes out of it on one charge.</p><p>In real-life, I’ve been able to get through an entire day of standard use with no real worries. Starting from 100%:</p><ul><li><strong>Two hours at the gym with music playing and regular screen opening to read news between sets: </strong>Battery went down to 92%</li><li><strong>Two hours on the phone with my wife — visiting websites on inside screen to finalize wedding celebration plans: </strong>Battery went down to 84%</li><li><strong>TikTok wormhole on inside screen for an hour: </strong>Battery went down to 79%</li><li><strong>Photography trip around London, multitasking between messaging apps, TikTok on the Underground, a couple phone calls, web browsing, and taking many photos: </strong>Battery went down to 64%</li></ul><p>By the time I got to the Nvidia afterparty at 10pm, the battery was at around 50%. Of course, if I’m more sparing with my use, you can make this run much longer. But it’s clear you’re getting all-day usage with no problems.</p><h2 id="snap-happy">Snap happy</h2><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="oamV7tYGgYvikv5tkwbSFS" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/oamV7tYGgYvikv5tkwbSFS-1920-80.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 always have a beef with Samsung about its camera science. The hardware is always good, but coming from being an iPhone user, the focus on vividity always makes me feel like the phones of old have just vomited color all over the screen.</p><p>Not anymore. These dual 50MP shooters are <strong>impressive</strong>. Detail preservation is good and while color balance does lean towards the warmer tones, they’re not as distractingly vivid as before — keeping natural skin tones looking realistic.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/29iQeBJUpQQUAbSetehJpS-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/PGxQecLCXiBnVC3CQjqQfS-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/QNP5MEL6HrDsn53sTA8JSS-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>And shout-out to night time photography too. I know Samsung made a whole song and dance about Nightography with the Ultra’s 200MP lens, but you’re getting more than enough of that experience with a quarter of the megapixels here.</p><h2 id="outlook-2">Outlook</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="gW5R8PkMJxqWV74zHBrCpR" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/gW5R8PkMJxqWV74zHBrCpR-1920-80.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>This is the first foldable I’ve properly daily driven. I have tested others in the past of course, but this is my first concerted effort to ditch a candy bar and give folds a chance. And after my first day and a half, I get the attraction to it.</p><p>There was a part of me that feared this would be a pure gimmick. And to many of you reading this, chances are it will be. You’ve got to have very specific use cases on lock to make the most of this — the work and content needs for that bigger screen if you’re always on-the-go.</p><p>If you have them, this more easily pocketable foldable is a real conversation starter, and a genuinely nice form factor. My only real problem is that $1,899 price tag. It’s massive to say the least! You can feel the premium nature of this phone, but that’s a huge cost to put on people. </p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt">I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/id-buy-a-galaxy-z-fold-8-over-the-z-fold-8-ultra-and-its-all-because-it-steals-this-z-trifold-feature">I'd buy a Galaxy Z Fold 8 over the Z Fold 8 Ultra — and it's all because it steals this Z TriFold feature</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Flip 8 deals — top plans and offers in Australia ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung's Galaxy Z Flip 8 is out now, which means the pre-order window has closed. While that means it's too late to claim some of the bonuses that were available ahead of release, it's still possible to get the new device at a good price from Australia's top carriers and retailers.</p><p>In case you missed it, here's what you can expect from the Galaxy Z Flip 8: the new model keeps the familiar 4.1‑inch cover screen and 6.9‑inch folding display, but both panels benefit from Samsung’s latest durability upgrades. The Galaxy Z Flip 8’s crease is noticeably reduced thanks to its updated hinge and the titanium‑alloy reinforcement beneath the display — the same structural upgrade introduced on the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a> series.</p><p>The biggest practical change is under the hood: the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a> jumps to a 4300mAh battery, a substantial lift from last year’s 3700mAh pack that gives the clamshell far more staying power. Charging remains at 25W wired and 15W wireless, but the larger battery alone makes a meaningful difference for day‑to‑day use.</p><p>The Galaxy Z Flip 8 hit Australian shelves on August 14, 2026, with prices starting at AU$1,949. While many of the early‑bird perks are no longer available, it's still possible to get a good price if you take our buying advice. </p><p>Here are the best Samsung Galaxy Z plans and offers available right now. It's also a good idea to check out today’s <a href="https://www.tomsguide.com/au/coupons/samsung.com">Samsung discount codes</a> for any additional savings that might be up for grabs.</p><h3 class="article-body__section" id="section-best-galaxy-z-flip-8-offers"><span>Best Galaxy Z Flip 8 offers</span></h3><p>Samsung, Amazon Australia and Optus are offering the strongest value on the Galaxy Z Flip 8 during pre‑orders, with a mix of cashback, bonuses and sizeable plan discounts depending on how you prefer to buy.</p><p>If you’re grabbing the Galaxy Z Flip 8 outright, <a href="https://www.samsung.com/au/smartphones/galaxy-z-flip8/buy/">Samsung’s bundle of launch perks</a> is the most flexible. You can stack an Eco‑Voucher worth AU$150 when you use the code <strong>UNFOLD2026</strong> and pair the phone with other Samsung gear in the first 72 hours (dropping to AU$50 afterwards), plus AU$150 back when you check out with PayPal. Samsung is also offering AU$100 in bonus trade‑in credit for Flip buyers. </p><p>Amazon keeps things straightforward with a <a href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV">AU$300 Amazon digital gift card included with Galaxy Z Flip 8 pre‑orders</a>, making it the simplest outright deal of the bunch.</p><p>For anyone looking for a telco plan to spreading the handset cost out into monthly instalments, Optus is the standout option. The carrier is <a href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-flip8">taking AU$750 off the Galaxy Z Flip 8</a> on eligible repayment plans and pairing it with discounted SIM pricing for the first year. Vodafone’s trade-in offer is smaller but still worthwhile: <a href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-flip8">AU$500 off the handset on a 24‑ or 36‑month plan</a>, plus a AU$300 trade‑in bonus for eligible devices.</p><p>Below, you’ll find a full breakdown of every worthwhile Galaxy Z Flip 8 pre‑order offer available in Australia right now — from outright savings to carrier discounts and trade‑in bonuses — so you can lock in the best value before launch day.</p><div class="product"><a data-dimension112="9fe886aa-86fe-11f1-8908-ff8dd4cb6394" data-action="Deal Block" data-label="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension48="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV" 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="EaJx7PLL3rAQSY9BEgEGi3" name="Amazon-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EaJx7PLL3rAQSY9BEgEGi3-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Amazon: </strong><a href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV" target="_blank" data-dimension112="9fe886aa-86fe-11f1-8908-ff8dd4cb6394" data-action="Deal Block" data-label="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension48="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension25=""><strong>Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8</strong></a></p><p>Amazon is keeping it simple for outright buyers: eligible purchases of the <a href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV" target="_blank">Galaxy Z Flip 8</a> comes with AU$150 in Amazon store credit for free. If you trade in an old phone, you can also get an Amazon gift card valued at up to AU$800. Better hurry though  — the bonus store credit offer is only available until August 26, 2026.<a class="view-deal button" href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV" target="_blank" rel="nofollow" data-dimension112="9fe886aa-86fe-11f1-8908-ff8dd4cb6394" data-action="Deal Block" data-label="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension48="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe88646-86fe-11f1-8f75-193cdeb48199" data-action="Deal Block" data-label="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension48="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" href="https://www.samsung.com/au/smartphones/galaxy-z-flip8/buy/" target="_blank" rel="sponsored"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="g2Lu9U9HTxMfgS4ck3uDBd" name="Samsung-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g2Lu9U9HTxMfgS4ck3uDBd-1920-80.jpg" mos="" align="middle" fullscreen="" width="4000" height="4000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Samsung: </strong><a href="https://www.samsung.com/au/smartphones/galaxy-z-flip8/buy/" target="_blank" data-dimension112="9fe88646-86fe-11f1-8f75-193cdeb48199" data-action="Deal Block" data-label="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension48="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension25=""><strong>AU$80 bonus trade-in credit or Eco-Voucher</strong></a></p><p>If you buy straight from Samsung, you'll get AU$80 bonus trade-in credit on top of what your old device is worth. Alternatively, those who don't have an handset to trade in will get an AU$80 Eco-Voucher to use on a future purchase. This offer ends September 9, 2026. T&Cs apply.<a class="view-deal button" href="https://www.samsung.com/au/smartphones/galaxy-z-flip8/buy/" target="_blank" rel="sponsored" data-dimension112="9fe88646-86fe-11f1-8f75-193cdeb48199" data-action="Deal Block" data-label="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension48="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe888f8-86fe-11f1-b8c7-af58f39a6371" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" href="https://www.jbhifi.com.au/collections/mobile-phones/samsung-galaxy-z-flip8" 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="dUMxuvDTBa7Tnj2jRqi8ME" name="JB-Hi-Fi-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dUMxuvDTBa7Tnj2jRqi8ME-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>JB Hi-Fi: </strong><a href="https://www.jbhifi.com.au/collections/mobile-phones/samsung-galaxy-z-flip8" target="_blank" data-dimension112="9fe888f8-86fe-11f1-b8c7-af58f39a6371" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension25=""><strong>Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8</strong></a></p><p>JB Hi-Fi offers an easy-to-use retail perk by including a AU$150 JB Hi-Fi Gift Card (digital or in-store) with all Z Flip 8 Ultra purchases. This makes JB Hi-Fi a decent option for outright buyers, though it's worth noting that Amazon's offer provides just as much value in terms of store credit. You'd better move fast — this offer is valid until August 26, 2026.<a class="view-deal button" href="https://www.jbhifi.com.au/collections/mobile-phones/samsung-galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="9fe888f8-86fe-11f1-b8c7-af58f39a6371" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe88966-86fe-11f1-bf2c-732ead9910cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-flip8" 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="YwvBBB6x3H2wXEEEevoNYC" name="Optus-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YwvBBB6x3H2wXEEEevoNYC-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Optus: </strong><a href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-flip8" target="_blank" data-dimension112="9fe88966-86fe-11f1-bf2c-732ead9910cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension25=""><strong>Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months</strong></a></p><p>Optus offers a simplified, model-agnostic plan deal by slashing AU$600 off any model in the lineup (Z Fold 8 or Z Fold 8 Ultra) on a 12-, 24-, or 36-month repayment plan. To complement the device discountThis offer ends on September 6, 2026.<a class="view-deal button" href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="9fe88966-86fe-11f1-bf2c-732ead9910cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe889d4-86fe-11f1-8055-5935a795fb57" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-flip8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:550px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="QfajE7yyJxPSmrv4c6Jwv7" name="vodafone logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QfajE7yyJxPSmrv4c6Jwv7-1920-80.jpg" mos="" align="middle" fullscreen="" width="550" height="550" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Vodafone: </strong><a href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-flip8" target="_blank" data-dimension112="9fe889d4-86fe-11f1-8055-5935a795fb57" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension25=""><strong>Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan</strong></a></p><p>Vodafone knocks AU$500 off both capacities of Z Flip 8 on 24- or 36-month repayment contracts. Customers signing up can also claim a AU$300 bonus trade-in credit and gain access to deep wearable discounts, taking up to AU$200 off the Galaxy Watch 9 or AU$500 off the Galaxy Watch Ultra 2 when bundled together. This offer ends August 13, 2026.<a class="view-deal button" href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="9fe889d4-86fe-11f1-8055-5935a795fb57" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe88a38-86fe-11f1-a702-63257493ae2c" data-action="Deal Block" data-label="Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in creditTelstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026." data-dimension48="Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in creditTelstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026." target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="f5n3uyYaoTiQepuaUPfaBg" name="telstra-square-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/f5n3uyYaoTiQepuaUPfaBg-1920-80.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in credit</strong></p><p>Telstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026.<a class="view-deal button" href="" target="_blank" rel="nofollow" data-dimension112="9fe88a38-86fe-11f1-a702-63257493ae2c" data-action="Deal Block" data-label="Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in creditTelstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026." data-dimension48="Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in creditTelstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026." data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-best-galaxy-z-flip-8-plans"><span>Best Galaxy Z Flip 8 plans</span></h3><h2 id="galaxy-z-flip-8-price-and-specs">Galaxy Z Flip 8 price and specs</h2><iframe allow="" height="1170" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://tomsguide.whistleout.com.au/Widgets/MobilePhoneSearch/Load?calls=-1&customer=Personal&data=5000&phone=Samsung-Galaxy-Z-Flip8-5G-256GB&sms=-1&maxresults=10&includefeatured=false&hd=Samsung%20Galaxy%20Z%20Fold%208%20Plans%20(256GB)"></iframe><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>From AU$1,949</p></td></tr><tr><td class="firstcol " ><p><strong>Release date</strong></p></td><td  ><p>August 14</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong>    </p></td><td  ><p>6.9-inch AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong>    </p></td><td  ><p>4.1-inch AMOLED (948 x 1048, 60Hz / 120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Exynos 2600</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB / 512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong>    </p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Camera</strong>    </p></td><td  ><p>10MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>25W wired / 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>4,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>166.9 x 75.4 x 6.1 mm (unfolded), 85.7 x 75.4 x 13.1mm (folded)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>180 grams</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong>    </p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Pink, Graphite, Cream, Mint (online)</p></td></tr></tbody></table></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-deals-au</link>
                                                                            <description>
                            <![CDATA[ The Samsung Galaxy Z Flip 8 is out now, and these are the best offers you'll find at Australia’s leading carriers and retailers. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">PJPTLHcX5C5Ytu9VyzKyTW</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UsDbKYaT4XPPXsE8AmtpCJ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 06:29:06 +0000</pubDate>                                                                                                                                <updated>Tue, 25 Aug 2026 00:54:58 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Stephen Lambrechts ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JN3jEQpqyyt32as8AJJqXe-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Stephen Lambrechts is the Managing Editor of Tom&#039;s Guide AU and has written professionally across the categories of tech, film, television and gaming for the last 15 years. Before Tom&#039;s Guide, he spent several years as a Senior Journalist at TechRadar, had a brief stint as Editor in Chief at Official Xbox Magazine Australia, and worked at IGN. He&#039;s also written for such mags and sites as APC, TechLife Australia, T3, FilmInk, Daily Telegraph and AskMen. Additionally, he&#039;s a Tomatometer-approved critic on Rotten Tomatoes, and has offered his tech advice on radio and television.&lt;/p&gt;&lt;p&gt;He&#039;s an expert when it comes to smartphones, TVs, gaming and streaming, having contributed many reviews in each of those categories over the years. Despite his many articles on streaming, he&#039;s a passionate collector of physical media who enjoys listening to vinyl records and acquiring obscure horror movies from the &#039;60s, &#039;70s and 80s. He can usually be seen rocking the latest retro sneaker releases, particularly Air Jordans and Reebok Pumps. Occasionally, he also indulges in other non-hipster stuff, like hiking.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UsDbKYaT4XPPXsE8AmtpCJ-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / John Velasco]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Flip 8 held in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Flip 8 held in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Flip 8 held in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UsDbKYaT4XPPXsE8AmtpCJ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung's Galaxy Z Flip 8 is out now, which means the pre-order window has closed. While that means it's too late to claim some of the bonuses that were available ahead of release, it's still possible to get the new device at a good price from Australia's top carriers and retailers.</p><p>In case you missed it, here's what you can expect from the Galaxy Z Flip 8: the new model keeps the familiar 4.1‑inch cover screen and 6.9‑inch folding display, but both panels benefit from Samsung’s latest durability upgrades. The Galaxy Z Flip 8’s crease is noticeably reduced thanks to its updated hinge and the titanium‑alloy reinforcement beneath the display — the same structural upgrade introduced on the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a> series.</p><p>The biggest practical change is under the hood: the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a> jumps to a 4300mAh battery, a substantial lift from last year’s 3700mAh pack that gives the clamshell far more staying power. Charging remains at 25W wired and 15W wireless, but the larger battery alone makes a meaningful difference for day‑to‑day use.</p><p>The Galaxy Z Flip 8 hit Australian shelves on August 14, 2026, with prices starting at AU$1,949. While many of the early‑bird perks are no longer available, it's still possible to get a good price if you take our buying advice. </p><p>Here are the best Samsung Galaxy Z plans and offers available right now. It's also a good idea to check out today’s <a href="https://www.tomsguide.com/au/coupons/samsung.com">Samsung discount codes</a> for any additional savings that might be up for grabs.</p><h3 class="article-body__section" id="section-best-galaxy-z-flip-8-offers"><span>Best Galaxy Z Flip 8 offers</span></h3><p>Samsung, Amazon Australia and Optus are offering the strongest value on the Galaxy Z Flip 8 during pre‑orders, with a mix of cashback, bonuses and sizeable plan discounts depending on how you prefer to buy.</p><p>If you’re grabbing the Galaxy Z Flip 8 outright, <a href="https://www.samsung.com/au/smartphones/galaxy-z-flip8/buy/">Samsung’s bundle of launch perks</a> is the most flexible. You can stack an Eco‑Voucher worth AU$150 when you use the code <strong>UNFOLD2026</strong> and pair the phone with other Samsung gear in the first 72 hours (dropping to AU$50 afterwards), plus AU$150 back when you check out with PayPal. Samsung is also offering AU$100 in bonus trade‑in credit for Flip buyers. </p><p>Amazon keeps things straightforward with a <a href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV">AU$300 Amazon digital gift card included with Galaxy Z Flip 8 pre‑orders</a>, making it the simplest outright deal of the bunch.</p><p>For anyone looking for a telco plan to spreading the handset cost out into monthly instalments, Optus is the standout option. The carrier is <a href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-flip8">taking AU$750 off the Galaxy Z Flip 8</a> on eligible repayment plans and pairing it with discounted SIM pricing for the first year. Vodafone’s trade-in offer is smaller but still worthwhile: <a href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-flip8">AU$500 off the handset on a 24‑ or 36‑month plan</a>, plus a AU$300 trade‑in bonus for eligible devices.</p><p>Below, you’ll find a full breakdown of every worthwhile Galaxy Z Flip 8 pre‑order offer available in Australia right now — from outright savings to carrier discounts and trade‑in bonuses — so you can lock in the best value before launch day.</p><div class="product"><a data-dimension112="9fe886aa-86fe-11f1-8908-ff8dd4cb6394" data-action="Deal Block" data-label="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension48="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV" 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="EaJx7PLL3rAQSY9BEgEGi3" name="Amazon-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EaJx7PLL3rAQSY9BEgEGi3-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Amazon: </strong><a href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV" target="_blank" data-dimension112="9fe886aa-86fe-11f1-8908-ff8dd4cb6394" data-action="Deal Block" data-label="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension48="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension25=""><strong>Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8</strong></a></p><p>Amazon is keeping it simple for outright buyers: eligible purchases of the <a href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV" target="_blank">Galaxy Z Flip 8</a> comes with AU$150 in Amazon store credit for free. If you trade in an old phone, you can also get an Amazon gift card valued at up to AU$800. Better hurry though  — the bonus store credit offer is only available until August 26, 2026.<a class="view-deal button" href="https://www.amazon.com.au/Samsung-Version-Hands-Free-Customisable-FlexWindow/dp/B0H7X7SRFV" target="_blank" rel="nofollow" data-dimension112="9fe886aa-86fe-11f1-8908-ff8dd4cb6394" data-action="Deal Block" data-label="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension48="Amazon: Get AU$150 Amazon store credit when you purchase Galaxy Z Flip 8" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe88646-86fe-11f1-8f75-193cdeb48199" data-action="Deal Block" data-label="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension48="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" href="https://www.samsung.com/au/smartphones/galaxy-z-flip8/buy/" target="_blank" rel="sponsored"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="g2Lu9U9HTxMfgS4ck3uDBd" name="Samsung-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g2Lu9U9HTxMfgS4ck3uDBd-1920-80.jpg" mos="" align="middle" fullscreen="" width="4000" height="4000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Samsung: </strong><a href="https://www.samsung.com/au/smartphones/galaxy-z-flip8/buy/" target="_blank" data-dimension112="9fe88646-86fe-11f1-8f75-193cdeb48199" data-action="Deal Block" data-label="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension48="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension25=""><strong>AU$80 bonus trade-in credit or Eco-Voucher</strong></a></p><p>If you buy straight from Samsung, you'll get AU$80 bonus trade-in credit on top of what your old device is worth. Alternatively, those who don't have an handset to trade in will get an AU$80 Eco-Voucher to use on a future purchase. This offer ends September 9, 2026. T&Cs apply.<a class="view-deal button" href="https://www.samsung.com/au/smartphones/galaxy-z-flip8/buy/" target="_blank" rel="sponsored" data-dimension112="9fe88646-86fe-11f1-8f75-193cdeb48199" data-action="Deal Block" data-label="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension48="Samsung: AU$80 bonus trade-in credit or Eco-Voucher" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe888f8-86fe-11f1-b8c7-af58f39a6371" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" href="https://www.jbhifi.com.au/collections/mobile-phones/samsung-galaxy-z-flip8" 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="dUMxuvDTBa7Tnj2jRqi8ME" name="JB-Hi-Fi-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dUMxuvDTBa7Tnj2jRqi8ME-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>JB Hi-Fi: </strong><a href="https://www.jbhifi.com.au/collections/mobile-phones/samsung-galaxy-z-flip8" target="_blank" data-dimension112="9fe888f8-86fe-11f1-b8c7-af58f39a6371" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension25=""><strong>Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8</strong></a></p><p>JB Hi-Fi offers an easy-to-use retail perk by including a AU$150 JB Hi-Fi Gift Card (digital or in-store) with all Z Flip 8 Ultra purchases. This makes JB Hi-Fi a decent option for outright buyers, though it's worth noting that Amazon's offer provides just as much value in terms of store credit. You'd better move fast — this offer is valid until August 26, 2026.<a class="view-deal button" href="https://www.jbhifi.com.au/collections/mobile-phones/samsung-galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="9fe888f8-86fe-11f1-b8c7-af58f39a6371" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Flip 8" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe88966-86fe-11f1-bf2c-732ead9910cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-flip8" 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="YwvBBB6x3H2wXEEEevoNYC" name="Optus-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YwvBBB6x3H2wXEEEevoNYC-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Optus: </strong><a href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-flip8" target="_blank" data-dimension112="9fe88966-86fe-11f1-bf2c-732ead9910cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension25=""><strong>Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months</strong></a></p><p>Optus offers a simplified, model-agnostic plan deal by slashing AU$600 off any model in the lineup (Z Fold 8 or Z Fold 8 Ultra) on a 12-, 24-, or 36-month repayment plan. To complement the device discountThis offer ends on September 6, 2026.<a class="view-deal button" href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="9fe88966-86fe-11f1-bf2c-732ead9910cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Flip 8 device and stay connected for 12, 24 or 36 months" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe889d4-86fe-11f1-8055-5935a795fb57" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-flip8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:550px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="QfajE7yyJxPSmrv4c6Jwv7" name="vodafone logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QfajE7yyJxPSmrv4c6Jwv7-1920-80.jpg" mos="" align="middle" fullscreen="" width="550" height="550" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Vodafone: </strong><a href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-flip8" target="_blank" data-dimension112="9fe889d4-86fe-11f1-8055-5935a795fb57" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension25=""><strong>Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan</strong></a></p><p>Vodafone knocks AU$500 off both capacities of Z Flip 8 on 24- or 36-month repayment contracts. Customers signing up can also claim a AU$300 bonus trade-in credit and gain access to deep wearable discounts, taking up to AU$200 off the Galaxy Watch 9 or AU$500 off the Galaxy Watch Ultra 2 when bundled together. This offer ends August 13, 2026.<a class="view-deal button" href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="9fe889d4-86fe-11f1-8055-5935a795fb57" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="9fe88a38-86fe-11f1-a702-63257493ae2c" data-action="Deal Block" data-label="Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in creditTelstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026." data-dimension48="Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in creditTelstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026." target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:800px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="f5n3uyYaoTiQepuaUPfaBg" name="telstra-square-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/f5n3uyYaoTiQepuaUPfaBg-1920-80.jpg" mos="" align="middle" fullscreen="" width="800" height="800" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in credit</strong></p><p>Telstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026.<a class="view-deal button" href="" target="_blank" rel="nofollow" data-dimension112="9fe88a38-86fe-11f1-a702-63257493ae2c" data-action="Deal Block" data-label="Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in creditTelstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026." data-dimension48="Telstra: Save AU$500 when purchasing Galaxy Z Flip 8 on an eligible 24- or 36-month plan + AU$300 bonus trade-in creditTelstra is knocking AU$500 off the Z Flip 8 if you put the phone on a 12-, 24- or 36-month plan. You can also get a AU$300 trade-in bonus on top of your old device's trade-in value. This offer ends August 13, 2026." data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-best-galaxy-z-flip-8-plans"><span>Best Galaxy Z Flip 8 plans</span></h3><h2 id="galaxy-z-flip-8-price-and-specs">Galaxy Z Flip 8 price and specs</h2><iframe allow="" height="1170" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://tomsguide.whistleout.com.au/Widgets/MobilePhoneSearch/Load?calls=-1&customer=Personal&data=5000&phone=Samsung-Galaxy-Z-Flip8-5G-256GB&sms=-1&maxresults=10&includefeatured=false&hd=Samsung%20Galaxy%20Z%20Fold%208%20Plans%20(256GB)"></iframe><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>From AU$1,949</p></td></tr><tr><td class="firstcol " ><p><strong>Release date</strong></p></td><td  ><p>August 14</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong>    </p></td><td  ><p>6.9-inch AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong>    </p></td><td  ><p>4.1-inch AMOLED (948 x 1048, 60Hz / 120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Exynos 2600</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB / 512GB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong>    </p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Camera</strong>    </p></td><td  ><p>10MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>25W wired / 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>4,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>166.9 x 75.4 x 6.1 mm (unfolded), 85.7 x 75.4 x 13.1mm (folded)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>180 grams</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong>    </p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Pink, Graphite, Cream, Mint (online)</p></td></tr></tbody></table></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just spent 24 hours with the Galaxy Z fold 8 Ultra — here's what I liked and what I didn't ]]></title>
                                                                                                <dc:content><![CDATA[ <p>It's always exciting to try a brand new phone, and those first 24 hours can be pretty telling. That's especially true when you're making the jump from a regular phone to a foldable, because the fold-out large screen design opens a whole new world of possibilities.</p><p>That's certainly how I felt while unpackaging the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Samsung Galaxy Z Fold 8 Ultra </a>— a phone that has so far been living up to its new designation. But a brief hands-on can only tell you so much about a phone, and it's only after spending several hours (or days) with your device that you can get a much clearer idea of what it has to 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/oFT-YOrakEg" allowfullscreen></iframe></div></div><p>The Galaxy Z Fold 8 Ultra could be one of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>, pending our full review, thanks to the sheer amount of upgrades Samsung has added this year. But is it really all that? Let's go through my first day with this Ultra foldable, so you can experience the highs (and lows) of picking one up for yourself.</p><h2 id="setting-up">Setting up</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SxUXvGmQvGJ82W3KnAuTYm" name="PXL_20260723_153353658" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/SxUXvGmQvGJ82W3KnAuTYm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The great thing about modern phones is that they've made the set up process an absolute breeze compared to what it used to be like. Samsung is easily one of the best I've used, especially if you're copying data over from another Samsung phone.</p><p>In fact my<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review"> Galaxy S26 Ultra</a> detected the Z Fold 8 Ultra right away, and brought up the QR code scanner to link these two devices together. The most troublesome part of the whole experience was flicking through the many menus asking you to confirm various permissions, and which search engine you'd like set as your default. </p><p>The actual transfer process happens in the background, beaming over apps, accounts, default settings and everything else you had sitting on your own phone. Since my S26 Ultra doesn't get a ton of use, that process was pretty quick, and your experience will differ depending on how much you actually need to beam to your new phone.</p><p>I also find myself pretty impressed with the way Galaxy foldables set up fingerprint recognition. Samsung phones are usually some of the easiest and fastest devices for setting up biometric security, but with the physical fingerprint scanner all you need to do is wiggle your chosen digit around during the mapping process. None of the tedious lifting and replacing motions that you get with under-display fingerprint scanners. </p><h2 id="adapting-to-new-displays">Adapting to new displays</h2><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="eLMVZ9zvqMV9V9gmY4nUfm" name="PXL_20260723_153800876" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/eLMVZ9zvqMV9V9gmY4nUfm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Switching to a foldable phone means adapting to a brand new set of displays. The 6.5-inch cover display offers a 21:9 aspect ratio, which is noticeably narrower than the 19:5:9 aspect ratio you'd find on most phones. </p><p>Having been used to using  6.3-inch non-folding phones for so long, the narrower form factor is taking some getting used to. To the point where I gravitate towards the 8-inch foldable display instead. It seems like a paradox, but I find the larger screen is a lot more comfortable to use — especially considering the doubled-screen is the perfect size for two-handed use.</p><p>As Samsung says, it's like having two 6.5-inch phones in a single phone.</p><p>One thing I noticed was that the Samsung web browser defaulted to the desktop view on both screens, and to my surprise I actually found it more comfortable to read that way. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EHKpRgYwit7wtK6JkUvEcm" name="PXL_20260723_154034644" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/EHKpRgYwit7wtK6JkUvEcm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Admittedly the text was rather small on the cover display, but the mobile option was too large and squashed together for me to read comfortably. It was almost like I had an accessibility feature that blew up the print for users with visual impairments. That said vertical videos looked perfect on the narrower cover display, with next to no wasted space. </p><p>That was not entirely true for horizontal video, but that just gave the foldable screen even more chance to shine. Especially since Flex Mode let me partially fold up the screen and use the Z Fold 8 Ultra as its own stand.</p><p>I'll admit, though, it does still feel as though something is missing with the larger screen, and <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">I feel like having some kind of S Pen support</a> would help complete the puzzle. I'm not entirely sure I would be using the stylus all that much, but it would be nice to have the option.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XbDPDW"></div>                            </div>                            <script src="https://kwizly.com/embed/XbDPDW.js" async></script><h2 id="not-quite-crease-free">Not quite crease-free</h2><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="MQkbeXqvtqBcXLFh5FTd94" name="PXL_20260723_104725084" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" src="https://cdn.mos.cms.futurecdn.net/MQkbeXqvtqBcXLFh5FTd94-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One of the most anticipated upgrades on the Z fold 8 Ultra is the flex titanium display, which was heavily <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-may-eliminate-the-display-crease-too-step-aside-iphone-fold">rumored to eliminate the crease down the display</a>. It doesn't take long to spot that this is not really the case, and the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one">crease is still visible</a> in certain conditions.</p><p>That being said, the crease is a lot harder to see when compared to the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7.</a> It mostly shows up when the screen is switched off, or you find yourself in particularly bright conditions. The fact you have to go out of your way to see the crease means Samsung should be commended for what it's managed by adding the <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex Titanium</a> display. </p><p>That said, you can still feel the crease when you're scrolling along the large display. It feels almost identical to the Z Fold 7's crease, and I have to admit the more I use the phone the more distracting it is to come across the dip in the middle of the screen. That's definitely something Samsung needs to work on for the Z Fold 9 Ultra.</p><h2 id="galaxy-class-performance">Galaxy-class performance?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cTifXBtrnANVtbvxaBQhjm" name="PXL_20260723_153613981" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/cTifXBtrnANVtbvxaBQhjm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While I haven't done any benchmarking with the Galaxy Z Fold 8 Ultra yet, I have done some gaming to try and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-just-confirmed-the-most-obvious-galaxy-z-fold-8-upgrade-but-im-still-surprised">take the new Snapdragon 8 Elite Gen 5 for Galaxy chipset</a> for a spin. Loading up PUBG Mobile and I found that the settings automatically set the frame rate to the highest level, though it was being a little bit stingy with the graphics until I told it to up the ante.</p><p>The performance at the highest possible settings was excellent, as I'd hoped. I didn't notice any frame rate issues while I played, and the graphics were exactly what I expected from PUBG after dabbling with the game over the past few years. Better still I didn't even feel the phone get warm throughout an hour of playthrough, which is always best for the long-term health of the phone.</p><p>As for the battery, I found that this play session ate up around 5% of my battery, including the time it took to download the more advanced graphics. </p><p>Similarly, I forgot to charge the Z Fold 8 Ultra overnight, but still managed to get to around 3.45 p.m. before it flashed up a battery warning. That bodes well for the actual battery life, but since we haven't tested it I can't say whether Samsung's 27 hour battery life claim is accurate or not.</p><h2 id="cameras-are-so-far-so-samsung">Cameras are so-far so-Samsung</h2><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="mdwDsgb4mmvfC7T47Efewm" name="PXL_20260723_153702005" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/mdwDsgb4mmvfC7T47Efewm-1920-80.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 haven't had much need to take photos with the Z Fold 8 Ultra so far, but it's not like I need an excuse to snap photos of my dogs — especially when they make such adorable models. Needless to say, I'm impressed with the photos I've taken with the Galaxy Z Fold 8 Ultra so far.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Rau4SAqveDxu7PjRWnTELn-1920-80.jpg" alt="samsung galaxy z fold 8 ultra sample photos" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/y2kGLKf8HndGP4TkV2YPM5-1920-80.jpg" alt="labador" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ZSGz3vXpD6YgrRVP75jPAn-1920-80.jpg" alt="samsung galaxy z fold 8 ultra sample photos" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eg5zKpgcoFcSz8x9zdLykm-1920-80.jpg" alt="samsung galaxy z fold 8 ultra sample photos" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RZ8K8YeYUkYsVtMUH36Yvm-1920-80.jpg" alt="samsung galaxy z fold 8 ultra sample photos" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/j23D7nFQdRWzBFGi45WVnB-1920-80.jpg" alt="tomato plant" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The photos of my dogs and my plants came out looking pretty well, though I will admit that the main lens struggled with close-ups of my Lego minifigures. For some reason it just would not focus on what I wanted, meaning I had to resort to the lower-resolution Ultrawide angle lens to actually get this shot of Captain Jean-Luc Brickard. </p><p>You can kind of tell that the resolution isn't really there, though the photo itself still looks rather good. Sadly, the telephoto lens doesn't quite match up, and the quality feels more akin to the 10MP selfie cameras rather than the other two rear lenses. I wouldn't say it's taking bad photos, but they're not quite the caliber I would expect from a $2,100 phone.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Ms28JUWAB3P2Rnpb3zHGuh-1920-80.jpg" alt="tom pritchard selfie" /><figcaption>200MP main lens<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Mcq9S4JHKy5LP24NgN28H5-1920-80.jpg" alt="tom Pritchard" /><figcaption>10MP selfie lens<small role="credit">Future</small></figcaption></figure></figure><p>As for the selfie camera, I won't say that I dislike the photos it takes, but it falters compared to that main 200MP camera. The selfies feel a little grainier and washed out, and I feel like you'd be better off taking advantage of the rear cameras instead. The very nature of foldables, and the fact you can use the cover display as a viewfinder, means that's a very real option for you.</p><p>If anyone is interested in how I got my tomatoes looking so nice after the immense <a href="https://www.tomsguide.com/home/how-to-protect-your-lawn-from-the-next-heatwave-3-drought-proofing-steps-pros-swear-by">heat and drought we've been having in the U.K.</a>, <a href="https://www.tomsguide.com/how-to/7-surprising-ways-you-can-reuse-old-coffee-grounds">the answer is coffee grounds</a>. Those leftovers mean I haven't had to feed my tomato plant all summer. Sadly, the same can't be said for my pepper plant, which hasn't even flowered yet.</p><h2 id="the-ai-isn-t-ready-this-soon">The AI isn't ready this soon</h2><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="6bUozneavx3TWuWo7Ff7Um" name="PXL_20260723_153421125" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/6bUozneavx3TWuWo7Ff7Um-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As much as Samsung (and other phone companies) love to hype up AI capabilities, you can't really take full advantage of them on day one. The fact that Galaxy AI already has information on me, transferred over from my Galaxy S26 Ultra, meant that they weren't completely useless. So Now Brief had some basic information from places like my calendar to get me started.</p><p>However, I did need to go through a bunch of setup processes, like updating Samsung's Personal Data Intelligence and creating my own custom cards, to start making the most of the feature. On a similar note, the fact that Now Nudge hadn't had time to burrow into the depths of my phone hasn't been able to surface any useful information so far.</p><p>I have attempted to utilize MyFanCam, which lets you edit videos in a way that focuses on a single subject rather than an entire group. </p><p>I had hoped I would be able to use the feature to video my dogs playing, and help keep the focus on one of the two, instead of having to try and keep their crazy antics in frame all the time. But apparently the AI that powers MyFanCam doesn't recognize dogs, only people. Stay tuned for more.</p><h2 id="what-a-difference-a-day-makes">What a difference a day makes</h2><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="qZ3hFwNMPAjdkh9oaNX6Ym" name="PXL_20260723_153709681" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/qZ3hFwNMPAjdkh9oaNX6Ym-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>24 hours is not a lot of time when it comes to getting to grips with a new phone, especially when there are AI features that need time and resources to get themselves working at anything close to operating capacity. Still, it's a good amount of time to start getting to grips with a new device, and for all its potential flaws I am rather happy with the Galaxy Z Fold 8 Ultra so far.</p><p>I am not a huge fan of the narrow cover display, and feel like the wider Z Fold 8 might offer a better experience in that regard. I do like the main 8-inch display, though, especially since it makes viewing and scrolling a more comfortable experience than you'd normally get. Though I would have liked the option to use an S Pen, and hope Samsung brings it back sooner rather than later.</p><p>Of course, there's still plenty of testing that needs doing before we can publish our full review. While I hope this shapes up to be one of the best foldable phones, 24 hours just isn't enough to make that happen. That means it's time to get testing and see what this phone can really do.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">‘We're pretty confident': How Samsung plans to fight the first foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/id-buy-a-galaxy-z-fold-8-over-the-z-fold-8-ultra-and-its-all-because-it-steals-this-z-trifold-feature">I'd buy a Galaxy Z Fold 8 over the Z Fold 8 Ultra — and it's all because it steals this Z TriFold feature</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-just-spent-24-hours-with-the-galaxy-z-fold-8-ultra-heres-what-i-liked-and-what-i-didnt</link>
                                                                            <description>
                            <![CDATA[ Samsung galaxy Z Fold 8 is shaping up to be a great phone, but after 24 hours with the phone there are definitely some things I'd change. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">Fti5JmQj4Fg6aqTrXwFdAQ</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/noN4XNdYP8ruPAPbWSqySm-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Fri, 24 Jul 2026 05:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/noN4XNdYP8ruPAPbWSqySm-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[samsung galaxy z fold 8 ultra sample photos]]></media:description>                                                            <media:text><![CDATA[samsung galaxy z fold 8 ultra sample photos]]></media:text>
                                <media:title type="plain"><![CDATA[samsung galaxy z fold 8 ultra sample photos]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/noN4XNdYP8ruPAPbWSqySm-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>It's always exciting to try a brand new phone, and those first 24 hours can be pretty telling. That's especially true when you're making the jump from a regular phone to a foldable, because the fold-out large screen design opens a whole new world of possibilities.</p><p>That's certainly how I felt while unpackaging the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Samsung Galaxy Z Fold 8 Ultra </a>— a phone that has so far been living up to its new designation. But a brief hands-on can only tell you so much about a phone, and it's only after spending several hours (or days) with your device that you can get a much clearer idea of what it has to 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/oFT-YOrakEg" allowfullscreen></iframe></div></div><p>The Galaxy Z Fold 8 Ultra could be one of the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a>, pending our full review, thanks to the sheer amount of upgrades Samsung has added this year. But is it really all that? Let's go through my first day with this Ultra foldable, so you can experience the highs (and lows) of picking one up for yourself.</p><h2 id="setting-up">Setting up</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="SxUXvGmQvGJ82W3KnAuTYm" name="PXL_20260723_153353658" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/SxUXvGmQvGJ82W3KnAuTYm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The great thing about modern phones is that they've made the set up process an absolute breeze compared to what it used to be like. Samsung is easily one of the best I've used, especially if you're copying data over from another Samsung phone.</p><p>In fact my<a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-s26-ultra-review"> Galaxy S26 Ultra</a> detected the Z Fold 8 Ultra right away, and brought up the QR code scanner to link these two devices together. The most troublesome part of the whole experience was flicking through the many menus asking you to confirm various permissions, and which search engine you'd like set as your default. </p><p>The actual transfer process happens in the background, beaming over apps, accounts, default settings and everything else you had sitting on your own phone. Since my S26 Ultra doesn't get a ton of use, that process was pretty quick, and your experience will differ depending on how much you actually need to beam to your new phone.</p><p>I also find myself pretty impressed with the way Galaxy foldables set up fingerprint recognition. Samsung phones are usually some of the easiest and fastest devices for setting up biometric security, but with the physical fingerprint scanner all you need to do is wiggle your chosen digit around during the mapping process. None of the tedious lifting and replacing motions that you get with under-display fingerprint scanners. </p><h2 id="adapting-to-new-displays">Adapting to new displays</h2><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="eLMVZ9zvqMV9V9gmY4nUfm" name="PXL_20260723_153800876" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/eLMVZ9zvqMV9V9gmY4nUfm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Switching to a foldable phone means adapting to a brand new set of displays. The 6.5-inch cover display offers a 21:9 aspect ratio, which is noticeably narrower than the 19:5:9 aspect ratio you'd find on most phones. </p><p>Having been used to using  6.3-inch non-folding phones for so long, the narrower form factor is taking some getting used to. To the point where I gravitate towards the 8-inch foldable display instead. It seems like a paradox, but I find the larger screen is a lot more comfortable to use — especially considering the doubled-screen is the perfect size for two-handed use.</p><p>As Samsung says, it's like having two 6.5-inch phones in a single phone.</p><p>One thing I noticed was that the Samsung web browser defaulted to the desktop view on both screens, and to my surprise I actually found it more comfortable to read that way. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="EHKpRgYwit7wtK6JkUvEcm" name="PXL_20260723_154034644" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/EHKpRgYwit7wtK6JkUvEcm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Admittedly the text was rather small on the cover display, but the mobile option was too large and squashed together for me to read comfortably. It was almost like I had an accessibility feature that blew up the print for users with visual impairments. That said vertical videos looked perfect on the narrower cover display, with next to no wasted space. </p><p>That was not entirely true for horizontal video, but that just gave the foldable screen even more chance to shine. Especially since Flex Mode let me partially fold up the screen and use the Z Fold 8 Ultra as its own stand.</p><p>I'll admit, though, it does still feel as though something is missing with the larger screen, and <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">I feel like having some kind of S Pen support</a> would help complete the puzzle. I'm not entirely sure I would be using the stylus all that much, but it would be nice to have the option.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XbDPDW"></div>                            </div>                            <script src="https://kwizly.com/embed/XbDPDW.js" async></script><h2 id="not-quite-crease-free">Not quite crease-free</h2><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="MQkbeXqvtqBcXLFh5FTd94" name="PXL_20260723_104725084" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" src="https://cdn.mos.cms.futurecdn.net/MQkbeXqvtqBcXLFh5FTd94-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>One of the most anticipated upgrades on the Z fold 8 Ultra is the flex titanium display, which was heavily <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-may-eliminate-the-display-crease-too-step-aside-iphone-fold">rumored to eliminate the crease down the display</a>. It doesn't take long to spot that this is not really the case, and the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one">crease is still visible</a> in certain conditions.</p><p>That being said, the crease is a lot harder to see when compared to the <a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review">Galaxy Z Fold 7.</a> It mostly shows up when the screen is switched off, or you find yourself in particularly bright conditions. The fact you have to go out of your way to see the crease means Samsung should be commended for what it's managed by adding the <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex Titanium</a> display. </p><p>That said, you can still feel the crease when you're scrolling along the large display. It feels almost identical to the Z Fold 7's crease, and I have to admit the more I use the phone the more distracting it is to come across the dip in the middle of the screen. That's definitely something Samsung needs to work on for the Z Fold 9 Ultra.</p><h2 id="galaxy-class-performance">Galaxy-class performance?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4032px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="cTifXBtrnANVtbvxaBQhjm" name="PXL_20260723_153613981" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/cTifXBtrnANVtbvxaBQhjm-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>While I haven't done any benchmarking with the Galaxy Z Fold 8 Ultra yet, I have done some gaming to try and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-just-confirmed-the-most-obvious-galaxy-z-fold-8-upgrade-but-im-still-surprised">take the new Snapdragon 8 Elite Gen 5 for Galaxy chipset</a> for a spin. Loading up PUBG Mobile and I found that the settings automatically set the frame rate to the highest level, though it was being a little bit stingy with the graphics until I told it to up the ante.</p><p>The performance at the highest possible settings was excellent, as I'd hoped. I didn't notice any frame rate issues while I played, and the graphics were exactly what I expected from PUBG after dabbling with the game over the past few years. Better still I didn't even feel the phone get warm throughout an hour of playthrough, which is always best for the long-term health of the phone.</p><p>As for the battery, I found that this play session ate up around 5% of my battery, including the time it took to download the more advanced graphics. </p><p>Similarly, I forgot to charge the Z Fold 8 Ultra overnight, but still managed to get to around 3.45 p.m. before it flashed up a battery warning. That bodes well for the actual battery life, but since we haven't tested it I can't say whether Samsung's 27 hour battery life claim is accurate or not.</p><h2 id="cameras-are-so-far-so-samsung">Cameras are so-far so-Samsung</h2><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="mdwDsgb4mmvfC7T47Efewm" name="PXL_20260723_153702005" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/mdwDsgb4mmvfC7T47Efewm-1920-80.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 haven't had much need to take photos with the Z Fold 8 Ultra so far, but it's not like I need an excuse to snap photos of my dogs — especially when they make such adorable models. Needless to say, I'm impressed with the photos I've taken with the Galaxy Z Fold 8 Ultra so far.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Rau4SAqveDxu7PjRWnTELn-1920-80.jpg" alt="samsung galaxy z fold 8 ultra sample photos" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/y2kGLKf8HndGP4TkV2YPM5-1920-80.jpg" alt="labador" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/ZSGz3vXpD6YgrRVP75jPAn-1920-80.jpg" alt="samsung galaxy z fold 8 ultra sample photos" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/eg5zKpgcoFcSz8x9zdLykm-1920-80.jpg" alt="samsung galaxy z fold 8 ultra sample photos" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/RZ8K8YeYUkYsVtMUH36Yvm-1920-80.jpg" alt="samsung galaxy z fold 8 ultra sample photos" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/j23D7nFQdRWzBFGi45WVnB-1920-80.jpg" alt="tomato plant" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>The photos of my dogs and my plants came out looking pretty well, though I will admit that the main lens struggled with close-ups of my Lego minifigures. For some reason it just would not focus on what I wanted, meaning I had to resort to the lower-resolution Ultrawide angle lens to actually get this shot of Captain Jean-Luc Brickard. </p><p>You can kind of tell that the resolution isn't really there, though the photo itself still looks rather good. Sadly, the telephoto lens doesn't quite match up, and the quality feels more akin to the 10MP selfie cameras rather than the other two rear lenses. I wouldn't say it's taking bad photos, but they're not quite the caliber I would expect from a $2,100 phone.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Ms28JUWAB3P2Rnpb3zHGuh-1920-80.jpg" alt="tom pritchard selfie" /><figcaption>200MP main lens<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/Mcq9S4JHKy5LP24NgN28H5-1920-80.jpg" alt="tom Pritchard" /><figcaption>10MP selfie lens<small role="credit">Future</small></figcaption></figure></figure><p>As for the selfie camera, I won't say that I dislike the photos it takes, but it falters compared to that main 200MP camera. The selfies feel a little grainier and washed out, and I feel like you'd be better off taking advantage of the rear cameras instead. The very nature of foldables, and the fact you can use the cover display as a viewfinder, means that's a very real option for you.</p><p>If anyone is interested in how I got my tomatoes looking so nice after the immense <a href="https://www.tomsguide.com/home/how-to-protect-your-lawn-from-the-next-heatwave-3-drought-proofing-steps-pros-swear-by">heat and drought we've been having in the U.K.</a>, <a href="https://www.tomsguide.com/how-to/7-surprising-ways-you-can-reuse-old-coffee-grounds">the answer is coffee grounds</a>. Those leftovers mean I haven't had to feed my tomato plant all summer. Sadly, the same can't be said for my pepper plant, which hasn't even flowered yet.</p><h2 id="the-ai-isn-t-ready-this-soon">The AI isn't ready this soon</h2><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="6bUozneavx3TWuWo7Ff7Um" name="PXL_20260723_153421125" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/6bUozneavx3TWuWo7Ff7Um-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>As much as Samsung (and other phone companies) love to hype up AI capabilities, you can't really take full advantage of them on day one. The fact that Galaxy AI already has information on me, transferred over from my Galaxy S26 Ultra, meant that they weren't completely useless. So Now Brief had some basic information from places like my calendar to get me started.</p><p>However, I did need to go through a bunch of setup processes, like updating Samsung's Personal Data Intelligence and creating my own custom cards, to start making the most of the feature. On a similar note, the fact that Now Nudge hadn't had time to burrow into the depths of my phone hasn't been able to surface any useful information so far.</p><p>I have attempted to utilize MyFanCam, which lets you edit videos in a way that focuses on a single subject rather than an entire group. </p><p>I had hoped I would be able to use the feature to video my dogs playing, and help keep the focus on one of the two, instead of having to try and keep their crazy antics in frame all the time. But apparently the AI that powers MyFanCam doesn't recognize dogs, only people. Stay tuned for more.</p><h2 id="what-a-difference-a-day-makes">What a difference a day makes</h2><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="qZ3hFwNMPAjdkh9oaNX6Ym" name="PXL_20260723_153709681" alt="samsung galaxy z fold 8 ultra sample photos" src="https://cdn.mos.cms.futurecdn.net/qZ3hFwNMPAjdkh9oaNX6Ym-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>24 hours is not a lot of time when it comes to getting to grips with a new phone, especially when there are AI features that need time and resources to get themselves working at anything close to operating capacity. Still, it's a good amount of time to start getting to grips with a new device, and for all its potential flaws I am rather happy with the Galaxy Z Fold 8 Ultra so far.</p><p>I am not a huge fan of the narrow cover display, and feel like the wider Z Fold 8 might offer a better experience in that regard. I do like the main 8-inch display, though, especially since it makes viewing and scrolling a more comfortable experience than you'd normally get. Though I would have liked the option to use an S Pen, and hope Samsung brings it back sooner rather than later.</p><p>Of course, there's still plenty of testing that needs doing before we can publish our full review. While I hope this shapes up to be one of the best foldable phones, 24 hours just isn't enough to make that happen. That means it's time to get testing and see what this phone can really do.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch">I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview">‘We're pretty confident': How Samsung plans to fight the first foldable iPhone</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/id-buy-a-galaxy-z-fold-8-over-the-z-fold-8-ultra-and-its-all-because-it-steals-this-z-trifold-feature">I'd buy a Galaxy Z Fold 8 over the Z Fold 8 Ultra — and it's all because it steals this Z TriFold feature</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Galaxy Z Fold 8 interview: Samsung on silicon carbon batteries, the (possible) S Pen return and the iPhone Ultra threat ]]></title>
                                                                                                <dc:content><![CDATA[ <p>By all accounts Samsung should be nervous. After literally inventing the foldable phone 7 years ago and steadily evolving the category, it looks like Apple is going to try to swoop in and steal its thunder this fall with the launch of the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone"><u>iPhone Ultra</u></a> (aka iPhone Fold).</p><p>But if you ask Samsung’s Jay Kim — the executive vice president overseeing the new Galaxy Z Fold 8 series launch — about this imminent threat, he exudes a quiet confidence.</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/azQSspXAvxY" allowfullscreen></iframe></div></div><p>“If our big market player is coming into the market… then it proves that what I have been thinking and envisioning — and how much effort that we put it in — is actually the right direction,” Kim said. </p><p>Samsung is so bullish that it’s broadening its portfolio to three foldable phones this year: the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review"><u>Galaxy Z Fold 8 Ultra</u></a>, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review"><u>Galaxy Z Flip 8</u></a> and the brand new <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review"><u>Galaxy Z Fold 8</u></a>, complete with a squat and wide design that looks a lot like what Apple is reportedly cooking up.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XQhmt5k5QE2M4Q56RCVwUL" name="Jay-Kim-interview-Mark-3" alt="Mark Spoonauer interviews Samsung's Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom's Guide" src="https://cdn.mos.cms.futurecdn.net/XQhmt5k5QE2M4Q56RCVwUL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Ahead of Samsung Galaxy Unpacked I sat down with Kim alongside Lance Ulanoff at TechRadar for a wide-ranging interview on the new foldable lineup, the upcoming competition, and what it’s going to take for this category to “succeed.”</p><h2 id="galaxy-z-fold-8-why-go-wide">Galaxy Z Fold 8: Why Go Wide?</h2><p>The regular Fold 8 is easily the most intriguing new Samsung device because it’s the first time the company has launched a wide form factor. </p><p>The Galaxy Z Fold 8 features a 5.5-inch cover display with a 10:16 aspect ratio and a 7.6-inch inner screen with a 4:3 ratio. And there’s a reason for going wide: it’s how people prefer to view content.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3608px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="GSPdvof24GQuZ8tTqSeV7X" name="Galaxy Z Fold 8-12" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/GSPdvof24GQuZ8tTqSeV7X-1920-80.jpg" mos="" align="middle" fullscreen="" width="3608" height="2029" attribution="" endorsement="" class="inline"></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 we looked at our consumer insights on how people react to the products, almost 50% are focused on media, whether on the outside or the inside main screen,” said Kim.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3261px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qA5XArRRqG3PioTebFtnTW" name="Galaxy Z Fold 8-32" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/qA5XArRRqG3PioTebFtnTW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3261" height="1834" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Typing on the external display of the Fold 8 is way more comfortable versus the narrower Z Fold 8 Ultra, and when watching videos on the main screen the black bars above and below the panel are much smaller than before.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2936px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="wu79gVE3Bzue9Efqdk47fW" name="Galaxy Z Fold 8-39" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/wu79gVE3Bzue9Efqdk47fW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2936" height="1651" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The other factor for Kim and the rest of the team was pocketability. So they sought to create a Goldilocks phone that combines the multitasking chops of the previous Folds with the compact design of the Flip. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nSUkoFkw2KtckkfuUAgNEL" name="Jay-Kim-interview-1" alt="Mark Spoonauer interviews Samsung's Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom's Guide" src="https://cdn.mos.cms.futurecdn.net/nSUkoFkw2KtckkfuUAgNEL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>“The Flip is sleek, thin and light, and our customers want both sides of that world. So we said why not?” Kim said.</p><p>The result is a phone that’s the lightest Fold yet at just 201 grams and in a shape that’s nearly identical to a passport.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3375px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="eionbEJ9292YsUMfnqnjjW" name="Galaxy Z Fold 8-22" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/eionbEJ9292YsUMfnqnjjW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3375" height="1898" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>“We studied it a lot,” Kim shared. “We put together the form factor where media makes the most sense for the content native without compromising anything on the bar type [phone experience].”</p><h2 id="galaxy-z-fold-8-vs-z-fold-8-ultra-who-should-get-what">Galaxy Z Fold 8 vs Z Fold 8 Ultra: Who should get what?</h2><p>Despite its name, the Galaxy Z Fold 8 is not a direct successor to the Galaxy Z Fold 7. It’s a completely new model. The sequel is actually the Z Fold 8 Ultra, which compelled me to ask why Samsung settled on this naming scheme and whether it could confuse shoppers.</p><div><blockquote><p>"Going with titanium was not just to make it thinner,” Kim said. “it actually helps you be durable and stable in the way you fold and unfold."</p></blockquote></div><p>“The Ultra is the highest, most premium, most advanced product,” Kim said. “We see a lot of Ultra consumers coming over to the Fold, asking for similar performance and cameras, so we put a lot of effort to match that capability.”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2772px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="sG4D9mpBszMGgWBxFvE29W" name="Galaxy Z Fold 8-38" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/sG4D9mpBszMGgWBxFvE29W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2772" height="1559" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>So why not call the Z Fold 8 the Fold Wide as was rumored? For Kim, Samsung wasn’t trying to create something new, but the new baseline standard for the Fold experience. “I think this is more of the essence of the Fold,” Kim said while pointing to the Fold 8.</p><p>With its bigger 8-inch display, bigger battery and triple-camera setup, the Fold 8 Ultra is more for productivity while the regular Fold 8 (wider displays, dual cameras) is more for content consumption.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PygTGJpVstH2NcZKZz3uVL" name="Jay-Kim-interview-Mark-4" alt="Mark Spoonauer interviews Samsung's Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom's Guide" src="https://cdn.mos.cms.futurecdn.net/PygTGJpVstH2NcZKZz3uVL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Z Fold 8 Ultra also gets some pretty major upgrades, including a new 50MP wide camera, an even thinner design (4.1 mm) that’s easier to open and a display that has virtually no crease, thanks in large part to the addition of Flex Titanium technology.</p><p>“Going with titanium was not just to make it thinner,” Kim said. “it actually helps you be durable and stable in the way you fold and unfold, so it's a combination of a lot of things coming together.”</p><h2 id="is-the-s-pen-coming-back">Is the S Pen coming back?</h2><p>The last Samsung foldable to feature the S Pen was the Galaxy Z Fold 6, but the company removed the digitizer in order to achieve a thinner design. It’s not coming back for the Fold 8 either, but Samsung isn’t closing the door on this feature.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9fC5bdQsx8w6X8ygkaXpaU" name="Galaxy Z Fold 6 and S Pen-8.jpg" alt="Samsung Galaxy Z Fold 6 and S Pen" src="https://cdn.mos.cms.futurecdn.net/9fC5bdQsx8w6X8ygkaXpaU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When asked if Samsung would consider bringing back the S Pen, even if it means going from 4.1mm thick to 4.2mm, Kim said “we’ll definitely consider your suggestion.”</p><p>“In order to focus on S Pen we have to make trade-offs. In order to put in (a digitizer) you have to sacrifice thinness or different aspects. But I think we wanted to address the most important feedback we got from the market.”</p><p>Since this interview we have heard from another Samsung executive that confirmed that the company is <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds"><u>open to bringing back the S Pen</u></a>. </p><h2 id="the-cautious-jump-to-silicon-carbon-batteries">The (cautious) jump to silicon carbon 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dMNhWVVdEx4Fk8ABZieXAg" name="Galaxy Z Fold 8 Ultra-32" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/dMNhWVVdEx4Fk8ABZieXAg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While Chinese phone makers have been pushing out devices with ultra-high capacity silicon carbon batteries for well over a year, Samsung has been sitting on the sidelines. And that’s understandable given the safety concerns around embracing any new battery technology.</p><p>With its new foldable lineup, however, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal"><u>Galaxy Z Fold 8 Ultra and Galaxy Z Fold 8 make the jump to silicon carbon</u></a>, delivering more capacity while keeping the designs super slim.</p><div><blockquote><p>“We have been testing silicon batteries for quite some time. We’re looking at being very — I wouldn’t say conservative — but more taking it one step at a time.”</p></blockquote></div><p>The Galaxy Z Fold 8 Ultra gets a 5,000 mAh silicon carbon battery (up from 4,400 on the Fold 7). And the Galaxy Z Fold 8 has a 4,800 mAh battery. </p><p>While silicon carbon does enable much higher capacity batteries, there have been some concerns around battery swelling and shorter overall lifecycles.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="A8hW63FkURmJ44BuJwpF7g" name="Galaxy Z Fold 8 Ultra-23" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/A8hW63FkURmJ44BuJwpF7g-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>“We have been testing the silicon batteries for quite some time,” Kim admitted. “We’re looking at being very — I wouldn’t say conservative — but more taking it one step at a time.”</p><p>The reason why Samsung is embracing silicon battery tech for foldables first is because you can’t simply put in a larger Li-ion battery, as it would balloon the designs.</p><p>“We’re doing a lot of testing and experimentation into how you make the product thin and light, and yet not push too much into the experimental stage,” Kim said.” “We have to be very confident that it’s durable and stable, and it has to be scalable.”</p><h2 id="the-apple-foldable-threat">The Apple foldable threat</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="68k2f3fRXG384SQqZMTjHM" name="iPhone Fold render3" alt="iPhone Fold render" src="https://cdn.mos.cms.futurecdn.net/68k2f3fRXG384SQqZMTjHM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple is famously late to lots of categories, and it looks like we’ll be able to add foldable phones to that list later this year.</p><p>And even though this will be Apple’s very first stab at a foldable, they’ve had the luxury of studying the market for years and biding their time to introduce something they believe shoppers will want.</p><div><blockquote><p>"It’s hard to comment because I don’t know what (Apple is) coming up with, but I’m very confident that our product will be one that consumers will appreciate."</p></blockquote></div><p>Analysts seem pretty high on Apple’s chances, with IDC predicting 22% worldwide market share in the first year and Counterpoint research projecting a whopping <a href="https://www.tomsguide.com/phones/iphones/apple-is-predicted-to-own-nearly-half-the-foldable-market-but-i-have-doubts-that-the-iphone-fold-can-help-achieve-it-heres-why"><u>48% share in North America</u></a>. So I asked Kim about these numbers and what he thinks about the arrival of the iPhone Fold/Ultra.</p><p>“It’s hard to comment because I don’t know what they’re coming up with,” Kim said, “but I’m very confident that our product will be one that consumers will appreciate.”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jdgj4DaDXyxg8nWLBrN5fZ" name="Samsung Galaxy Z Flip 8 hands-on" alt="Samsung Galaxy Z Flip 8 hands-on." src="https://cdn.mos.cms.futurecdn.net/jdgj4DaDXyxg8nWLBrN5fZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Of course, Samsung itself has been studying foldables for a long time, and they have a lot of market data. “Our consumers are already using the product every day in the market,” Kim emphasized.</p><p>Kim also noted that 30% of consumers are “coming back to foldables.” So it could be someone who owned a foldable, then went to an S Series device, and then has returned to a Fold or Flip because the devices keep getting 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:2797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="jDQR6ZY2cx8T5NxgCddxW" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/jDQR6ZY2cx8T5NxgCddxW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2797" height="1573" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Kim was also keen to subtly point out that Apple will likely only have a single foldable phone this fall while Samsung offers more choice.</p><p>“The market is actually moving pretty fast, and there's a lot of different needs, and we're trying to adapt to that,” Kim said. “Consumers should not be adopting a single size. We should be providing options.”</p><h2 id="when-will-foldables-truly-be-successful">When will foldables truly be ‘successful’?</h2><p>As we wound down our conversation with Jay Kim, my colleague Lance asked a pretty poignant question: “When do you consider the foldable category a success?”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xz5V8oBoW4g24PzQRgTkFS" name="Jay-Kim-interview-3" alt="Mark Spoonauer interviews Samsung's Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom's Guide" src="https://cdn.mos.cms.futurecdn.net/xz5V8oBoW4g24PzQRgTkFS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But instead of just launching into his answer, Kim turned the question on us. “Do we see [foldables] as a success?”</p><p>Lance said yes from an engineering standpoint but not from a marketing one because foldables are still a tiny slice of the overall market (about 4%).</p><p>I said I saw things as a dichotomy. People who have purchased devices like the Galaxy Z Fold 7 would call the category a success because they can enjoy the foldable experience without the usual penalties like a bulky design. But I also said success could look like 10% of the market, so 1 out of every 10 phones sold overall.</p><p>Kim told us that we could be “on the verge of foldables going mainstream” And it has a lot to do with Samsung making a bet on a totally new model in the Galaxy Z Fold 8.</p><p>“We’ve had these two form factors for a long time, Kim said. “Introducing another one is a bold move because it shows that we’re pretty confident in the category and how the market is going to react to it. I’m more excited about what’s to come.”</p> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/how-samsung-plans-to-fight-the-first-foldable-iphone-jay-kim-interview</link>
                                                                            <description>
                            <![CDATA[ I spoke with Samsung executive vice president Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8, including why they’re introducing a brand new design and how the company plans to take on Apple. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">dVkMNoBRdgV9YAfCQTpHLh</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/fABLqmFhGHGn2W2FwTAPVL-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 15:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 23 Jul 2026 17:15:09 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Mark Spoonauer ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/wtAspSzVfcKLB4JEd39AMo-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Mark Spoonauer is the global editor in chief of Tom&#039;s Guide and has covered technology for over 20 years. He oversees the direction of Tom&#039;s Guide and leads a team of over 25 journalists to bring you our expert buying guides, reviews, news, how-to articles, deals and other coverage.&lt;/p&gt;&lt;p&gt;Mark has a passion for covering all things mobile, having reviewed dozens of smartphones and other gadgets. He enjoys testing the top mobile devices and putting them up against each other in our in-depth face-offs. He also works hand in hand with our editors and testing team to continually improve how we evaluate products. &lt;/p&gt;&lt;p&gt;Having led Tom&#039;s Guide since 2013, Mark has focused on growing the core tech coverage of the site while also expanding into new areas, such as entertainment, fitness and home, recruiting talented writers and editors to help our readers figure out what to buy and how to get the most out of the products and services they use every day. &lt;/p&gt;&lt;p&gt;Mark has spoken at key industry events and appears regularly on TV to discuss the latest trends, including &lt;a href=&quot;https://cheddar.com/media/pixel-watch-gets-a-release-date-at-google-i-o-2022&quot;&gt;Cheddar&lt;/a&gt;, Fox 5, &lt;a href=&quot;https://www.foxbusiness.com/technology/apple-march-event-5g-iphone&quot;&gt;Fox Business&lt;/a&gt; and other outlets. Mark was previously editor in chief of Laptop Mag, and his work has appeared in Wired, Popular Science and Inc. Follow him on Twitter at @mspoonauer.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/fABLqmFhGHGn2W2FwTAPVL-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Mark Spoonauer interviews Samsung&#039;s Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom&#039;s Guide]]></media:description>                                                            <media:text><![CDATA[Mark Spoonauer interviews Samsung&#039;s Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom&#039;s Guide]]></media:text>
                                <media:title type="plain"><![CDATA[Mark Spoonauer interviews Samsung&#039;s Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom&#039;s Guide]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/fABLqmFhGHGn2W2FwTAPVL-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>By all accounts Samsung should be nervous. After literally inventing the foldable phone 7 years ago and steadily evolving the category, it looks like Apple is going to try to swoop in and steal its thunder this fall with the launch of the <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone"><u>iPhone Ultra</u></a> (aka iPhone Fold).</p><p>But if you ask Samsung’s Jay Kim — the executive vice president overseeing the new Galaxy Z Fold 8 series launch — about this imminent threat, he exudes a quiet confidence.</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/azQSspXAvxY" allowfullscreen></iframe></div></div><p>“If our big market player is coming into the market… then it proves that what I have been thinking and envisioning — and how much effort that we put it in — is actually the right direction,” Kim said. </p><p>Samsung is so bullish that it’s broadening its portfolio to three foldable phones this year: the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review"><u>Galaxy Z Fold 8 Ultra</u></a>, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review"><u>Galaxy Z Flip 8</u></a> and the brand new <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review"><u>Galaxy Z Fold 8</u></a>, complete with a squat and wide design that looks a lot like what Apple is reportedly cooking up.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="XQhmt5k5QE2M4Q56RCVwUL" name="Jay-Kim-interview-Mark-3" alt="Mark Spoonauer interviews Samsung's Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom's Guide" src="https://cdn.mos.cms.futurecdn.net/XQhmt5k5QE2M4Q56RCVwUL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Ahead of Samsung Galaxy Unpacked I sat down with Kim alongside Lance Ulanoff at TechRadar for a wide-ranging interview on the new foldable lineup, the upcoming competition, and what it’s going to take for this category to “succeed.”</p><h2 id="galaxy-z-fold-8-why-go-wide">Galaxy Z Fold 8: Why Go Wide?</h2><p>The regular Fold 8 is easily the most intriguing new Samsung device because it’s the first time the company has launched a wide form factor. </p><p>The Galaxy Z Fold 8 features a 5.5-inch cover display with a 10:16 aspect ratio and a 7.6-inch inner screen with a 4:3 ratio. And there’s a reason for going wide: it’s how people prefer to view content.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3608px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="GSPdvof24GQuZ8tTqSeV7X" name="Galaxy Z Fold 8-12" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/GSPdvof24GQuZ8tTqSeV7X-1920-80.jpg" mos="" align="middle" fullscreen="" width="3608" height="2029" attribution="" endorsement="" class="inline"></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 we looked at our consumer insights on how people react to the products, almost 50% are focused on media, whether on the outside or the inside main screen,” said Kim.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3261px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="qA5XArRRqG3PioTebFtnTW" name="Galaxy Z Fold 8-32" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/qA5XArRRqG3PioTebFtnTW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3261" height="1834" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Typing on the external display of the Fold 8 is way more comfortable versus the narrower Z Fold 8 Ultra, and when watching videos on the main screen the black bars above and below the panel are much smaller than before.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2936px;"><p class="vanilla-image-block" style="padding-top:56.23%;"><img id="wu79gVE3Bzue9Efqdk47fW" name="Galaxy Z Fold 8-39" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/wu79gVE3Bzue9Efqdk47fW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2936" height="1651" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>The other factor for Kim and the rest of the team was pocketability. So they sought to create a Goldilocks phone that combines the multitasking chops of the previous Folds with the compact design of the Flip. </p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="nSUkoFkw2KtckkfuUAgNEL" name="Jay-Kim-interview-1" alt="Mark Spoonauer interviews Samsung's Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom's Guide" src="https://cdn.mos.cms.futurecdn.net/nSUkoFkw2KtckkfuUAgNEL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>“The Flip is sleek, thin and light, and our customers want both sides of that world. So we said why not?” Kim said.</p><p>The result is a phone that’s the lightest Fold yet at just 201 grams and in a shape that’s nearly identical to a passport.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3375px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="eionbEJ9292YsUMfnqnjjW" name="Galaxy Z Fold 8-22" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/eionbEJ9292YsUMfnqnjjW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3375" height="1898" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>“We studied it a lot,” Kim shared. “We put together the form factor where media makes the most sense for the content native without compromising anything on the bar type [phone experience].”</p><h2 id="galaxy-z-fold-8-vs-z-fold-8-ultra-who-should-get-what">Galaxy Z Fold 8 vs Z Fold 8 Ultra: Who should get what?</h2><p>Despite its name, the Galaxy Z Fold 8 is not a direct successor to the Galaxy Z Fold 7. It’s a completely new model. The sequel is actually the Z Fold 8 Ultra, which compelled me to ask why Samsung settled on this naming scheme and whether it could confuse shoppers.</p><div><blockquote><p>"Going with titanium was not just to make it thinner,” Kim said. “it actually helps you be durable and stable in the way you fold and unfold."</p></blockquote></div><p>“The Ultra is the highest, most premium, most advanced product,” Kim said. “We see a lot of Ultra consumers coming over to the Fold, asking for similar performance and cameras, so we put a lot of effort to match that capability.”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2772px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="sG4D9mpBszMGgWBxFvE29W" name="Galaxy Z Fold 8-38" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/sG4D9mpBszMGgWBxFvE29W-1920-80.jpg" mos="" align="middle" fullscreen="" width="2772" height="1559" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>So why not call the Z Fold 8 the Fold Wide as was rumored? For Kim, Samsung wasn’t trying to create something new, but the new baseline standard for the Fold experience. “I think this is more of the essence of the Fold,” Kim said while pointing to the Fold 8.</p><p>With its bigger 8-inch display, bigger battery and triple-camera setup, the Fold 8 Ultra is more for productivity while the regular Fold 8 (wider displays, dual cameras) is more for content consumption.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="PygTGJpVstH2NcZKZz3uVL" name="Jay-Kim-interview-Mark-4" alt="Mark Spoonauer interviews Samsung's Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom's Guide" src="https://cdn.mos.cms.futurecdn.net/PygTGJpVstH2NcZKZz3uVL-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>The Z Fold 8 Ultra also gets some pretty major upgrades, including a new 50MP wide camera, an even thinner design (4.1 mm) that’s easier to open and a display that has virtually no crease, thanks in large part to the addition of Flex Titanium technology.</p><p>“Going with titanium was not just to make it thinner,” Kim said. “it actually helps you be durable and stable in the way you fold and unfold, so it's a combination of a lot of things coming together.”</p><h2 id="is-the-s-pen-coming-back">Is the S Pen coming back?</h2><p>The last Samsung foldable to feature the S Pen was the Galaxy Z Fold 6, but the company removed the digitizer in order to achieve a thinner design. It’s not coming back for the Fold 8 either, but Samsung isn’t closing the door on this feature.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="9fC5bdQsx8w6X8ygkaXpaU" name="Galaxy Z Fold 6 and S Pen-8.jpg" alt="Samsung Galaxy Z Fold 6 and S Pen" src="https://cdn.mos.cms.futurecdn.net/9fC5bdQsx8w6X8ygkaXpaU-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>When asked if Samsung would consider bringing back the S Pen, even if it means going from 4.1mm thick to 4.2mm, Kim said “we’ll definitely consider your suggestion.”</p><p>“In order to focus on S Pen we have to make trade-offs. In order to put in (a digitizer) you have to sacrifice thinness or different aspects. But I think we wanted to address the most important feedback we got from the market.”</p><p>Since this interview we have heard from another Samsung executive that confirmed that the company is <a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds"><u>open to bringing back the S Pen</u></a>. </p><h2 id="the-cautious-jump-to-silicon-carbon-batteries">The (cautious) jump to silicon carbon 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:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="dMNhWVVdEx4Fk8ABZieXAg" name="Galaxy Z Fold 8 Ultra-32" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/dMNhWVVdEx4Fk8ABZieXAg-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>While Chinese phone makers have been pushing out devices with ultra-high capacity silicon carbon batteries for well over a year, Samsung has been sitting on the sidelines. And that’s understandable given the safety concerns around embracing any new battery technology.</p><p>With its new foldable lineup, however, the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal"><u>Galaxy Z Fold 8 Ultra and Galaxy Z Fold 8 make the jump to silicon carbon</u></a>, delivering more capacity while keeping the designs super slim.</p><div><blockquote><p>“We have been testing silicon batteries for quite some time. We’re looking at being very — I wouldn’t say conservative — but more taking it one step at a time.”</p></blockquote></div><p>The Galaxy Z Fold 8 Ultra gets a 5,000 mAh silicon carbon battery (up from 4,400 on the Fold 7). And the Galaxy Z Fold 8 has a 4,800 mAh battery. </p><p>While silicon carbon does enable much higher capacity batteries, there have been some concerns around battery swelling and shorter overall lifecycles.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="A8hW63FkURmJ44BuJwpF7g" name="Galaxy Z Fold 8 Ultra-23" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/A8hW63FkURmJ44BuJwpF7g-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>“We have been testing the silicon batteries for quite some time,” Kim admitted. “We’re looking at being very — I wouldn’t say conservative — but more taking it one step at a time.”</p><p>The reason why Samsung is embracing silicon battery tech for foldables first is because you can’t simply put in a larger Li-ion battery, as it would balloon the designs.</p><p>“We’re doing a lot of testing and experimentation into how you make the product thin and light, and yet not push too much into the experimental stage,” Kim said.” “We have to be very confident that it’s durable and stable, and it has to be scalable.”</p><h2 id="the-apple-foldable-threat">The Apple foldable threat</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="68k2f3fRXG384SQqZMTjHM" name="iPhone Fold render3" alt="iPhone Fold render" src="https://cdn.mos.cms.futurecdn.net/68k2f3fRXG384SQqZMTjHM-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Apple is famously late to lots of categories, and it looks like we’ll be able to add foldable phones to that list later this year.</p><p>And even though this will be Apple’s very first stab at a foldable, they’ve had the luxury of studying the market for years and biding their time to introduce something they believe shoppers will want.</p><div><blockquote><p>"It’s hard to comment because I don’t know what (Apple is) coming up with, but I’m very confident that our product will be one that consumers will appreciate."</p></blockquote></div><p>Analysts seem pretty high on Apple’s chances, with IDC predicting 22% worldwide market share in the first year and Counterpoint research projecting a whopping <a href="https://www.tomsguide.com/phones/iphones/apple-is-predicted-to-own-nearly-half-the-foldable-market-but-i-have-doubts-that-the-iphone-fold-can-help-achieve-it-heres-why"><u>48% share in North America</u></a>. So I asked Kim about these numbers and what he thinks about the arrival of the iPhone Fold/Ultra.</p><p>“It’s hard to comment because I don’t know what they’re coming up with,” Kim said, “but I’m very confident that our product will be one that consumers will appreciate.”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="jdgj4DaDXyxg8nWLBrN5fZ" name="Samsung Galaxy Z Flip 8 hands-on" alt="Samsung Galaxy Z Flip 8 hands-on." src="https://cdn.mos.cms.futurecdn.net/jdgj4DaDXyxg8nWLBrN5fZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: John Velasco / Tom's Guide)</span></figcaption></figure><p>Of course, Samsung itself has been studying foldables for a long time, and they have a lot of market data. “Our consumers are already using the product every day in the market,” Kim emphasized.</p><p>Kim also noted that 30% of consumers are “coming back to foldables.” So it could be someone who owned a foldable, then went to an S Series device, and then has returned to a Fold or Flip because the devices keep getting 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:2797px;"><p class="vanilla-image-block" style="padding-top:56.24%;"><img id="jDQR6ZY2cx8T5NxgCddxW" name="Samsung Galaxy Z 8 lineup" alt="Samsung Galaxy Z 8 lineup." src="https://cdn.mos.cms.futurecdn.net/jDQR6ZY2cx8T5NxgCddxW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2797" height="1573" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Kim was also keen to subtly point out that Apple will likely only have a single foldable phone this fall while Samsung offers more choice.</p><p>“The market is actually moving pretty fast, and there's a lot of different needs, and we're trying to adapt to that,” Kim said. “Consumers should not be adopting a single size. We should be providing options.”</p><h2 id="when-will-foldables-truly-be-successful">When will foldables truly be ‘successful’?</h2><p>As we wound down our conversation with Jay Kim, my colleague Lance asked a pretty poignant question: “When do you consider the foldable category a success?”</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xz5V8oBoW4g24PzQRgTkFS" name="Jay-Kim-interview-3" alt="Mark Spoonauer interviews Samsung's Jay Kim about the launch of the Galaxy Z Fold 8, Fold 8 Ultra and Flip 8 for Tom's Guide" src="https://cdn.mos.cms.futurecdn.net/xz5V8oBoW4g24PzQRgTkFS-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But instead of just launching into his answer, Kim turned the question on us. “Do we see [foldables] as a success?”</p><p>Lance said yes from an engineering standpoint but not from a marketing one because foldables are still a tiny slice of the overall market (about 4%).</p><p>I said I saw things as a dichotomy. People who have purchased devices like the Galaxy Z Fold 7 would call the category a success because they can enjoy the foldable experience without the usual penalties like a bulky design. But I also said success could look like 10% of the market, so 1 out of every 10 phones sold overall.</p><p>Kim told us that we could be “on the verge of foldables going mainstream” And it has a lot to do with Samsung making a bet on a totally new model in the Galaxy Z Fold 8.</p><p>“We’ve had these two form factors for a long time, Kim said. “Introducing another one is a bold move because it shows that we’re pretty confident in the category and how the market is going to react to it. I’m more excited about what’s to come.”</p>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Galaxy Z Fold 8 Ultra doesn't have a crease-free display — but it's the closest Samsung has ever got to one ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Foldable phone makers have declared war on the display crease, and this year could be the year a bunch of them make real progress. Samsung, in particular, has been slowly reducing the visibility of the crease over the past few years, but the recent <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">launch of the Galaxy Z 8 series</a> marks the most significant reduction to date.</p><p>Rumors suggested that Samsung had managed to eliminate the crease, but I can promise you that this isn't the case based on my experience with the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra </a>over the past day. Samsung has made a lot of progress in making the crease less visible, but it hasn't managed to hide it from view completely.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ULUXv4kHnTVmDbGwRN9NB4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Left: Z Fold 7 | Right: Z Fold 8 Ultra<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/MQkbeXqvtqBcXLFh5FTd94-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Z Fold 8 Ultra<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iQKeyc8GYEefnzK5FAa2B4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Z Fold 7<small role="credit">Future</small></figcaption></figure></figure><p>I should make it very clear from the get-go that the crease on the Z Fold 8 Ultra is rather difficult to see at a glance. Especially when you compare it to the<a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"> Galaxy Z Fold 7,</a> which, despite its <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-7-can-survive-half-a-million-folds-according-to-independent-testing-and-thats-a-massive-upgrade">own screen refinements</a>, still has a rather prominent crease down the middle of its foldable screen.</p><p>That being said, the visibility of the crease all depends on what the phone is doing and what the lighting conditions are like. For instance, having the screen switched on makes the crease a lot harder to notice than when it's switched off. </p><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="4hYjjRJtsZ2rBPAVeuSTB4" name="PXL_20260723_105144060" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" src="https://cdn.mos.cms.futurecdn.net/4hYjjRJtsZ2rBPAVeuSTB4-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Bright, direct light is the worst offender for this. Which means that even though the Z Fold 8 Ultra has a new anti-reflective coating and a 3,000-nit display to aid performance in bright conditions, there's no hiding the prominent dip and warp running down the center of the screen. </p><p>That said, switch your location to a spot without bright and direct light, and the crease practically vanishes before your eyes. So long as the screen is switched on, that is.</p><p>Similarly, bright environments really highlight the warping around the center of the phone. However, it's not even close to as bad as the warping visible on the Z Fold 7. That level of warping is enough to visibly ruin whatever is on your screen, and is particularly pronounced in bright environments.</p><p>Tilting the screen around ruins the illusion too, but as long as you're avoiding direct light, it's still a bit of a struggle to see the crease on the Fold 8 Ultra. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/v4Kw7LWejpsKsWnk8EWa94-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Left: Z Fold 8 Ultra | Right: Z Fold 7<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/uRSstPhLxs7AGDTSJBtHB4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Left: Z Fold 8 Ultra | Right: Z Fold 7<small role="credit">Future</small></figcaption></figure></figure><p>Looking at the Z Fold 8 Ultra is only one part of the equation when it comes to the crease, though. Samsung doesn't seem to have made any headway in reducing the way the crease feels when you slide over it with your finger. </p><p>There's a noticeable bump, followed by a dip and another bump. It's not subtle, and the feeling is almost identical to that of the Galaxy Z Fold 7. That suggests to me that the hinge design hasn't changed since last year, and the <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex titanium</a> display doesn't seem to be doing much, if anything, to cushion everything underneath the display panel.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XbDPDW"></div>                            </div>                            <script src="https://kwizly.com/embed/XbDPDW.js" async></script><p>How this affects you is going to depend on how you use your Z Fold 8 or 8 Ultra. I've been using the larger screen in landscape mode, with the crease running from left to right, and that naturally means my thumb rolls over the crease quite a lot. Obviously, if I held the phone the other way, with the crease running from top to bottom, things would be totally different.</p><p>Obviously this is something prospective Galaxy Z Fold 8 owners need to be aware of. Just because Samsung has reduced the visibility of the Z Fold 8's crease by a considerable amount, it doesn't mean that you won't notice it. Whether that's because you're in a bright environment, or because you can't stop sliding over it while doing basic, everyday things on the larger screen.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/M5GcApuxCHZTWsqw6YCAC4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/DaoR8ut657H85m2DZXpPA4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Left: Z Fold 7 | Right: Z Fold 8 Ultra<small role="credit">Future</small></figcaption></figure></figure><p>Still, credit where credit is due, Samsung has done a lot to improve the look of the Galaxy Z Fold 8 Ultra's display. Though now the real question is how it will compare to the upcoming foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a>. </p><p>After all, Apple has reportedly been especially particular about the crease to the point where it <a href="https://www.tomsguide.com/phones/iphone-flip-tipped-to-eliminate-the-biggest-design-flaw-with-foldable-phones-heres-how">apparently delayed the phone until it could be eliminated</a>. But we'll have to wait until mid-to-late September to find out for sure.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal">Samsung Galaxy Z Fold 8 is the first Galaxy phone with a silicon carbon battery — here's why that's such a big deal</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">No, the Fold 8 doesn't have an S Pen — but Samsung is ‘exploring’ its return for future Folds</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-held-samsungs-secret-canceled-z-fold-8-prototypes-and-they-killed-the-best-one">I held Samsung’s secret, canceled Z Fold 8 prototypes — and they killed the best one</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-doesnt-have-a-crease-free-display-but-its-the-closest-samsung-has-ever-got-to-one</link>
                                                                            <description>
                            <![CDATA[ Samsung has made a huge amount of progress hiding the display crease, but it's not completely gone. Here's how it compares to the Z Fold 7. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">yictMPD5s2Cmws4jCbPWXi</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/TMxTujefvrU4ViKmUpsbUf-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 12:27:49 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ tom.pritchard@futurenet.com (Tom Pritchard) ]]></author>                    <dc:creator><![CDATA[ Tom Pritchard ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/biCewUkKfSA6QnT2HxVc3f-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/TMxTujefvrU4ViKmUpsbUf-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 Ultra shown in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 Ultra shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 Ultra shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/TMxTujefvrU4ViKmUpsbUf-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Foldable phone makers have declared war on the display crease, and this year could be the year a bunch of them make real progress. Samsung, in particular, has been slowly reducing the visibility of the crease over the past few years, but the recent <a href="https://www.tomsguide.com/news/live/samsung-galaxy-unpacked-2026-live">launch of the Galaxy Z 8 series</a> marks the most significant reduction to date.</p><p>Rumors suggested that Samsung had managed to eliminate the crease, but I can promise you that this isn't the case based on my experience with the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra </a>over the past day. Samsung has made a lot of progress in making the crease less visible, but it hasn't managed to hide it from view completely.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/ULUXv4kHnTVmDbGwRN9NB4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Left: Z Fold 7 | Right: Z Fold 8 Ultra<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/MQkbeXqvtqBcXLFh5FTd94-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Z Fold 8 Ultra<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/iQKeyc8GYEefnzK5FAa2B4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Z Fold 7<small role="credit">Future</small></figcaption></figure></figure><p>I should make it very clear from the get-go that the crease on the Z Fold 8 Ultra is rather difficult to see at a glance. Especially when you compare it to the<a href="https://www.tomsguide.com/phones/samsung-galaxy-z-fold-7-review"> Galaxy Z Fold 7,</a> which, despite its <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-7-can-survive-half-a-million-folds-according-to-independent-testing-and-thats-a-massive-upgrade">own screen refinements</a>, still has a rather prominent crease down the middle of its foldable screen.</p><p>That being said, the visibility of the crease all depends on what the phone is doing and what the lighting conditions are like. For instance, having the screen switched on makes the crease a lot harder to notice than when it's switched off. </p><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="4hYjjRJtsZ2rBPAVeuSTB4" name="PXL_20260723_105144060" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" src="https://cdn.mos.cms.futurecdn.net/4hYjjRJtsZ2rBPAVeuSTB4-1920-80.jpg" mos="" align="middle" fullscreen="" width="4032" height="2268" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>Bright, direct light is the worst offender for this. Which means that even though the Z Fold 8 Ultra has a new anti-reflective coating and a 3,000-nit display to aid performance in bright conditions, there's no hiding the prominent dip and warp running down the center of the screen. </p><p>That said, switch your location to a spot without bright and direct light, and the crease practically vanishes before your eyes. So long as the screen is switched on, that is.</p><p>Similarly, bright environments really highlight the warping around the center of the phone. However, it's not even close to as bad as the warping visible on the Z Fold 7. That level of warping is enough to visibly ruin whatever is on your screen, and is particularly pronounced in bright environments.</p><p>Tilting the screen around ruins the illusion too, but as long as you're avoiding direct light, it's still a bit of a struggle to see the crease on the Fold 8 Ultra. </p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/v4Kw7LWejpsKsWnk8EWa94-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Left: Z Fold 8 Ultra | Right: Z Fold 7<small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/uRSstPhLxs7AGDTSJBtHB4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Left: Z Fold 8 Ultra | Right: Z Fold 7<small role="credit">Future</small></figcaption></figure></figure><p>Looking at the Z Fold 8 Ultra is only one part of the equation when it comes to the crease, though. Samsung doesn't seem to have made any headway in reducing the way the crease feels when you slide over it with your finger. </p><p>There's a noticeable bump, followed by a dip and another bump. It's not subtle, and the feeling is almost identical to that of the Galaxy Z Fold 7. That suggests to me that the hinge design hasn't changed since last year, and the <a href="https://www.tomsguide.com/phones/samsung-phones/ive-seen-the-galaxy-z-fold-8s-flex-titanium-screen-and-apple-should-be-nervous">Flex titanium</a> display doesn't seem to be doing much, if anything, to cushion everything underneath the display panel.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-XbDPDW"></div>                            </div>                            <script src="https://kwizly.com/embed/XbDPDW.js" async></script><p>How this affects you is going to depend on how you use your Z Fold 8 or 8 Ultra. I've been using the larger screen in landscape mode, with the crease running from left to right, and that naturally means my thumb rolls over the crease quite a lot. Obviously, if I held the phone the other way, with the crease running from top to bottom, things would be totally different.</p><p>Obviously this is something prospective Galaxy Z Fold 8 owners need to be aware of. Just because Samsung has reduced the visibility of the Z Fold 8's crease by a considerable amount, it doesn't mean that you won't notice it. Whether that's because you're in a bright environment, or because you can't stop sliding over it while doing basic, everyday things on the larger screen.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/M5GcApuxCHZTWsqw6YCAC4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/DaoR8ut657H85m2DZXpPA4-1920-80.jpg" alt="samsung galaxy z fold 8 side by side with z fold 7 to show of display creases" /><figcaption>Left: Z Fold 7 | Right: Z Fold 8 Ultra<small role="credit">Future</small></figcaption></figure></figure><p>Still, credit where credit is due, Samsung has done a lot to improve the look of the Galaxy Z Fold 8 Ultra's display. Though now the real question is how it will compare to the upcoming foldable <a href="https://www.tomsguide.com/phones/iphones/iphone-fold-heres-what-the-leaks-and-rumors-say-about-apples-alleged-upcoming-foldable-phone">iPhone Ultra</a>. </p><p>After all, Apple has reportedly been especially particular about the crease to the point where it <a href="https://www.tomsguide.com/phones/iphone-flip-tipped-to-eliminate-the-biggest-design-flaw-with-foldable-phones-heres-how">apparently delayed the phone until it could be eliminated</a>. But we'll have to wait until mid-to-late September to find out for sure.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal">Samsung Galaxy Z Fold 8 is the first Galaxy phone with a silicon carbon battery — here's why that's such a big deal</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/no-the-fold-8-doesnt-have-an-s-pen-but-samsung-is-exploring-its-return-for-future-folds">No, the Fold 8 doesn't have an S Pen — but Samsung is ‘exploring’ its return for future Folds</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-held-samsungs-secret-canceled-z-fold-8-prototypes-and-they-killed-the-best-one">I held Samsung’s secret, canceled Z Fold 8 prototypes — and they killed the best one</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I'd buy a Galaxy Z Fold 8 over the Z Fold 8 Ultra — and it's all because it steals this Z TriFold feature ]]></title>
                                                                                                <dc:content><![CDATA[ <p>I got to see all of Samsung’s new foldable phones, but only one emerged as my favorite. That title belongs to the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a>, mainly due to how its wider design gives it an aspect ratio similar to an iPad mini, making it more suitable for watching videos.</p><p>But that’s not the main reason why I favor it. Instead, it’s how it steals the most unique feature of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-trifold-review">Galaxy Z TriFold</a>: its three-app side-by-side multitasking. While the more expensive <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> can run up to four apps simultaneously, the Z Fold 8 has the inherent advantage here because of how it lays them out.</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/oFT-YOrakEg" allowfullscreen></iframe></div></div><h2 id="unmatched-productivity">Unmatched productivity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2990px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RaSYsGcZBSQJkWkCfWgBgW" name="Galaxy Z Fold 8-16" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/RaSYsGcZBSQJkWkCfWgBgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2990" height="1682" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m much more demanding of my phone, so it’s no surprise why I prefer foldable phones like the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Motorola Razr Fold</a> that I’ve been using as my daily driver for the past couple of months. Unlike typical slab phones, notebook-style foldables are much better suited for running several apps simultaneously.</p><p>But what makes the Galaxy Z Fold 8 superior is how it adopts the side-by-side multitasking of the Galaxy Z TriFold. I’m specifically referring to how it can run three apps in their own windows, all at the same time — which it can do thanks to its 7.6-inch main display.</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/DbGMkCcRN-M/" target="_blank">A post shared by John Velasco (@john_c_velasco)</a></p><p>A photo posted by </p></blockquote></div><p>Unlike the Galaxy Z Fold 8 Ultra, which has a more square aspect ratio when opened, the Z Fold 8 is more rectangular and can therefore display three apps side-by-side simultaneously. What's great about this layout is that all three windows remain proportionate, with the ability to save them as an app pair shortcut for quick access later. And if you need just one more app, you can launch a fourth in a separate floating window.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kbf4yWwefijLKzGNFcJfUf" name="Galaxy Z Fold 8 Ultra-35" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/kbf4yWwefijLKzGNFcJfUf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I tried running three apps on the Galaxy Z Fold 8 Ultra’s 8-inch main display, but it would really only let me run two properly. You can introduce a third app, but it forces the layout to change so that one app remains in full view on one side, while the other two share the remaining half. This isn’t ideal because those two apps get shrunken down to the point where they're almost unusable.</p><h2 id="way-less-dead-space-with-videos">Way less dead space with videos</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/wu79gVE3Bzue9Efqdk47fW-1920-80.jpg" alt="Galaxy Z Fold 8 shown in hand" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Notebook-style phones benefit from having large main displays, but they often waste that extra real estate whenever I watch videos on them. Since most videos are shot in a 16:9 aspect ratio, playing them on foldables with square aspect ratios results in the video only occupying the middle portion of the screen — leaving large, unused black bars on the top and bottom.</p><p>It’s a real waste, and the Galaxy Z Fold 8 Ultra is no exception. However, there’s much less dead space on the Z Fold 8. As a result, the letterboxing isn't as glaring, making the viewing experience feel more seamless. When I played  the new "<a href="https://www.tomsguide.com/entertainment/movies/marvel-just-dropped-the-latest-avengers-doomsday-trailer-and-the-next-teaser-might-have-leaked-already">Avengers: Doomsday"</a> trailer on both phones, it was pretty evident that the Z Fold 8 simply gives you a larger video player.</p><h2 id="well-worth-the-trade-offs">Well worth the trade-offs</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3833px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xak7ZZSgMSrGM7iLiEfbtW" name="Galaxy Z Fold 8-4" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/xak7ZZSgMSrGM7iLiEfbtW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3833" height="2156" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Just to reiterate, three-app side-by-side multitasking that keeps every window the same size is exclusive to the Galaxy Z Fold 8 — you won’t get it on the Z Fold 8 Ultra. But while this feature is helpful, there are still a few trade-offs to consider if you’re deciding between the two.</p><p>With the Z Fold 8, you’re getting a dual-camera setup that lacks a dedicated telephoto lens, as well as a smaller 4,800 mAh battery. However, for $200 less, I think these trade-offs still make the Z Fold 8 the superior choice for most people.</p><p>In fact, it shares plenty of top-tier hardware with the pricier Z Fold 8 Ultra — including the Snapdragon 8 Elite Gen 5 chip, the same amount of RAM, One UI 9 running on Android 17, 45W wired charging, and 20W wireless charging.</p><p>If those aren’t enough reasons to convince you, it’s also much more pocketable. When it’s closed, holding the phone and using its cover screen is much easier. I can reach all four corners with my thumb, whereas reaching the top corners on the Z Fold 8 Ultra is a real stretch. When you’re on the subway with one hand on a rail and the other on your phone, you’ll have an easier time with the Z Fold 8.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xja2yO"></div>                            </div>                            <script src="https://kwizly.com/embed/Xja2yO.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/ai/google-gemini/i-hate-paying-for-calorie-tracking-apps-so-i-had-gemini-analyze-my-food-photos-instead-heres-what-it-found" target="_blank">I hate paying for calorie-tracking apps, so I had Gemini analyze my food photos instead — here’s what it found</a></li><li><a href="https://www.tomsguide.com/ai/i-replaced-my-notebook-with-an-ai-pen-for-a-month-heres-what-happened" target="_blank">I replaced my notebook with an AI pen for a month — here's what happened</a></li><li><a href="https://www.tomsguide.com/ai/i-used-this-ai-note-taker-to-record-my-meetings-for-a-week-and-it-made-my-workdays-more-focused-and-productive" target="_blank">I used this AI note taker to record my meetings for a week — and it made my workdays more focused and productive</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/id-buy-a-galaxy-z-fold-8-over-the-z-fold-8-ultra-and-its-all-because-it-steals-this-z-trifold-feature</link>
                                                                            <description>
                            <![CDATA[ Thanks to its wider aspect ratio, you get three-app side-by-side multitasking with the Galaxy Z Fold 8, which it steals from the TriFold. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">CBohDSNztu3D59Lz6JtXYE</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/ic937BdgqQSEM7V9XYxjGX-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 12:00:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ john.velasco@futurenet.com (John Velasco) ]]></author>                    <dc:creator><![CDATA[ John Velasco ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/TSj224oX8d5ERXaDs8pDGd-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ null ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/ic937BdgqQSEM7V9XYxjGX-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 shown in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/ic937BdgqQSEM7V9XYxjGX-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>I got to see all of Samsung’s new foldable phones, but only one emerged as my favorite. That title belongs to the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a>, mainly due to how its wider design gives it an aspect ratio similar to an iPad mini, making it more suitable for watching videos.</p><p>But that’s not the main reason why I favor it. Instead, it’s how it steals the most unique feature of the <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-trifold-review">Galaxy Z TriFold</a>: its three-app side-by-side multitasking. While the more expensive <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> can run up to four apps simultaneously, the Z Fold 8 has the inherent advantage here because of how it lays them out.</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/oFT-YOrakEg" allowfullscreen></iframe></div></div><h2 id="unmatched-productivity">Unmatched productivity</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2990px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="RaSYsGcZBSQJkWkCfWgBgW" name="Galaxy Z Fold 8-16" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/RaSYsGcZBSQJkWkCfWgBgW-1920-80.jpg" mos="" align="middle" fullscreen="" width="2990" height="1682" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I’m much more demanding of my phone, so it’s no surprise why I prefer foldable phones like the <a href="https://www.tomsguide.com/phones/motorola-phones/motorola-razr-fold-review">Motorola Razr Fold</a> that I’ve been using as my daily driver for the past couple of months. Unlike typical slab phones, notebook-style foldables are much better suited for running several apps simultaneously.</p><p>But what makes the Galaxy Z Fold 8 superior is how it adopts the side-by-side multitasking of the Galaxy Z TriFold. I’m specifically referring to how it can run three apps in their own windows, all at the same time — which it can do thanks to its 7.6-inch main display.</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/DbGMkCcRN-M/" target="_blank">A post shared by John Velasco (@john_c_velasco)</a></p><p>A photo posted by </p></blockquote></div><p>Unlike the Galaxy Z Fold 8 Ultra, which has a more square aspect ratio when opened, the Z Fold 8 is more rectangular and can therefore display three apps side-by-side simultaneously. What's great about this layout is that all three windows remain proportionate, with the ability to save them as an app pair shortcut for quick access later. And if you need just one more app, you can launch a fourth in a separate floating window.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:2000px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="kbf4yWwefijLKzGNFcJfUf" name="Galaxy Z Fold 8 Ultra-35" alt="Galaxy Z Fold 8 Ultra shown in hand" src="https://cdn.mos.cms.futurecdn.net/kbf4yWwefijLKzGNFcJfUf-1920-80.jpg" mos="" align="middle" fullscreen="" width="2000" height="1125" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>I tried running three apps on the Galaxy Z Fold 8 Ultra’s 8-inch main display, but it would really only let me run two properly. You can introduce a third app, but it forces the layout to change so that one app remains in full view on one side, while the other two share the remaining half. This isn’t ideal because those two apps get shrunken down to the point where they're almost unusable.</p><h2 id="way-less-dead-space-with-videos">Way less dead space with videos</h2><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/wu79gVE3Bzue9Efqdk47fW-1920-80.jpg" alt="Galaxy Z Fold 8 shown in hand" /><figcaption><small role="credit">Tom's Guide</small></figcaption></figure></figure><p>Notebook-style phones benefit from having large main displays, but they often waste that extra real estate whenever I watch videos on them. Since most videos are shot in a 16:9 aspect ratio, playing them on foldables with square aspect ratios results in the video only occupying the middle portion of the screen — leaving large, unused black bars on the top and bottom.</p><p>It’s a real waste, and the Galaxy Z Fold 8 Ultra is no exception. However, there’s much less dead space on the Z Fold 8. As a result, the letterboxing isn't as glaring, making the viewing experience feel more seamless. When I played  the new "<a href="https://www.tomsguide.com/entertainment/movies/marvel-just-dropped-the-latest-avengers-doomsday-trailer-and-the-next-teaser-might-have-leaked-already">Avengers: Doomsday"</a> trailer on both phones, it was pretty evident that the Z Fold 8 simply gives you a larger video player.</p><h2 id="well-worth-the-trade-offs">Well worth the trade-offs</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3833px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="xak7ZZSgMSrGM7iLiEfbtW" name="Galaxy Z Fold 8-4" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/xak7ZZSgMSrGM7iLiEfbtW-1920-80.jpg" mos="" align="middle" fullscreen="" width="3833" height="2156" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>Just to reiterate, three-app side-by-side multitasking that keeps every window the same size is exclusive to the Galaxy Z Fold 8 — you won’t get it on the Z Fold 8 Ultra. But while this feature is helpful, there are still a few trade-offs to consider if you’re deciding between the two.</p><p>With the Z Fold 8, you’re getting a dual-camera setup that lacks a dedicated telephoto lens, as well as a smaller 4,800 mAh battery. However, for $200 less, I think these trade-offs still make the Z Fold 8 the superior choice for most people.</p><p>In fact, it shares plenty of top-tier hardware with the pricier Z Fold 8 Ultra — including the Snapdragon 8 Elite Gen 5 chip, the same amount of RAM, One UI 9 running on Android 17, 45W wired charging, and 20W wireless charging.</p><p>If those aren’t enough reasons to convince you, it’s also much more pocketable. When it’s closed, holding the phone and using its cover screen is much easier. I can reach all four corners with my thumb, whereas reaching the top corners on the Z Fold 8 Ultra is a real stretch. When you’re on the subway with one hand on a rail and the other on your phone, you’ll have an easier time with the Z Fold 8.</p><div style="min-height: 250px;">                                <div class="kwizly-quiz kwizly-Xja2yO"></div>                            </div>                            <script src="https://kwizly.com/embed/Xja2yO.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/ai/google-gemini/i-hate-paying-for-calorie-tracking-apps-so-i-had-gemini-analyze-my-food-photos-instead-heres-what-it-found" target="_blank">I hate paying for calorie-tracking apps, so I had Gemini analyze my food photos instead — here’s what it found</a></li><li><a href="https://www.tomsguide.com/ai/i-replaced-my-notebook-with-an-ai-pen-for-a-month-heres-what-happened" target="_blank">I replaced my notebook with an AI pen for a month — here's what happened</a></li><li><a href="https://www.tomsguide.com/ai/i-used-this-ai-note-taker-to-record-my-meetings-for-a-week-and-it-made-my-workdays-more-focused-and-productive" target="_blank">I used this AI note taker to record my meetings for a week — and it made my workdays more focused and productive</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ 9 best Samsung Galaxy Z Fold 8 and Fold 8 Ultra cases to protect your new smartphone — from $19 ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung has officially revealed its highly-anticipated new Galaxy Z Fold 8 and Fold 8 Ultra smartphones. These feature-packed devices offer big foldout screens with crystal clear picture quality, housed in lightweight but durable handsets.</p><p>As you might expect for such hyped bits of kit, the Fold 8 and Fold 8 Ultra come with a fairly hefty price tag. Picking up a phone case is essential, then — and the good news is that there are already options available, which you can see below. </p><p>I've included Samsung's official Galaxy Z Fold 8 case, of course, but I've also picked out a selection of some of the best-looking cases from third party brands. There's something for every budget.</p>        <div class="featured_product_block featured_block_hero" data-id="d22d032e-8678-11f1-a6b9-a3f29890a8bc">            <a href="https://www.amazon.com/Hensinple-Compatible-Translucent-Protection-Shockproof/dp/B0H2LS9P6T/" data-model-name="Hensinple case for Galaxy Z Fold 8 Ultra" 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/xcxjQi3pSNRBMAxwVsD9wk.jpg" alt="Hensinple for Samsung Galaxy Z Fold 8 Ultra Case,z Fold 7| Z Fold8 Ultra Case [compatible With Magsafe] Translucent Matte Military Grade Protection Shockproof Rugged Magnetic Phone Cover(black)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Hensinple</div>                                        <div class="featured__title">Hensinple case for Galaxy Z Fold 8 Ultra</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d03b0-8678-11f1-ac11-9fb2a544123f">            <a href="https://www.amazon.com/FNTCASE-Samsung-Galaxy-Fold-Ultra/dp/B0GZ2XHVMF/" data-model-name="Fntcase case for Galaxy Z Fold 8 Ultra" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:96.60%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/UbmyWVQkckmdpH4C5qoNPm.jpg" alt="Fntcase for Samsung Galaxy Z Fold 8 Ultra Case: Galaxy Z Fold 7 Case [hinge Protection + Screen Protector] [fit for Magsafe] Military Grade Drop Protective, Translucent Matte Phone Cover - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>FNTCASE</div>                                        <div class="featured__title">Fntcase case for Galaxy Z Fold 8 Ultra</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d0428-8678-11f1-aacf-677eb828f83a">            <a href="https://www.amazon.com/Spigen-Armor-MagFit-Galaxy-Black/dp/B0GMVFRFYL/" data-model-name="Spigen Slim Armor Pro Magfit case for Galaxy Z Fold 8" 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/oayMnNBmzvBm5cQpDBunpm.jpg" alt="Spigen Slim Armor Pro Magfit for Galaxy Z Fold 8 Case, Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Spigen</div>                                        <div class="featured__title">Spigen Slim Armor Pro Magfit case for Galaxy Z Fold 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d0496-8678-11f1-82dc-a3c08d2e6a05">            <a href="https://www.ringkestore.com/products/galaxy-z-fold-8-case-onyx-flap-magnetic-screen-protectors-2p" data-model-name="Ringke Magnetic case and Screen Protectors for Galaxy Z Fold 8" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:116.28%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/J8uFt5kf7bZPoG8cyEBDZn.jpg" alt="[bundle] Galaxy Z Fold 8 | Onyx Flap Magnetic + Screen Protectors (2p) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Ringke Official Store</div>                                        <div class="featured__title">Ringke Magnetic case and Screen Protectors for Galaxy Z Fold 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d050e-8678-11f1-896f-7ba3a273eae1">            <a href="https://www.ringkestore.com/products/bundle-galaxy-z-fold-8-fusion-flap-magnetic-cover-display-easy-slide-tempered-glass-2p" data-model-name="Ringke Fusion Magnetic case and Screen Protectors for Galaxy Z Fold 8" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:116.28%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/9onKsGSChRTTfZpqpbhnqn.jpg" alt="[bundle] Galaxy Z Fold 8 | Fusion Flap Magnetic + Screen Protectors (2p)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Ringke Official Store</div>                                        <div class="featured__title">Ringke Fusion Magnetic case and Screen Protectors for Galaxy Z Fold 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d05fe-8678-11f1-b382-1366c6cc9c31">            <a href="https://thinborne.com/collections/galaxy-z-fold-8-ultra-case/products/galaxy-z-fold-8-ultra-case-red" data-model-name="ThinBorne case for Galaxy Z Fold 8 Ultra" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/TLef97VMzfqqH4tvqQ48BZ.jpg" alt="ThinBorne, ThinBorne case for Galaxy Z Fold8 Ultra"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>ThinBorne</div>                                        <div class="featured__title">ThinBorne case for Galaxy Z Fold 8 Ultra</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="69e341e4-867c-11f1-abd1-bbc8e9457508">            <a href="https://www.otterbox.com/products/galaxy-z-fold8-defender-series-pro-xt-case?variant=48109838696635" data-model-name="OtterBox Galaxy Z Fold 8 Defender Series Case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/BAZGMPw9nCiroXK5LQKtKK.jpg" alt="OtterBox, OtterBox Galaxy Z Fold 8 Defender Series Case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>OtterBox</div>                                        <div class="featured__title">OtterBox Galaxy Z Fold 8 Defender Series Case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d0676-8678-11f1-9713-0b4f4a7cb824">            <a href="https://www.amazon.com/TORRAS-Galaxy-Fold-Ultra-Samsung/dp/B0H2ZKRVPL/" data-model-name="Torras Vegskin for Galaxy Z Fold 8 Ultra Case Leather" 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/vgvYfBVk9Zh2KyZcjADei.jpg" alt="Torras Q3 Vegskin for Galaxy Z Fold 8 Ultra Case Leather, 360 Spin Magnetic Stand, Fit for Magsafe, Hinge Protection, Organic Silicone Leather Resists Stains, Slim Case for Samsung Fold8 Ultra, Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>TORRAS</div>                                        <div class="featured__title">Torras Vegskin for Galaxy Z Fold 8 Ultra Case Leather</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d06e4-8678-11f1-bc76-c35b29b2c395">            <a href="https://www.samsung.com/us/mobile-accessories/phones/galaxy-z-fold8-carbon-magnet-case-black-sku-ef-kf971sbegus/" data-model-name="Samsung Galaxy Z Fold 8 Carbon Magnet Case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/JHoeot8yzeM6T27GpDRepb.jpg" alt="Samsung, Samsung Galaxy Z Fold8 Carbon Magnet Case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Z Fold 8 Carbon Magnet Case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/9-best-samsung-galaxy-z-fold-8-and-fold-8-ultra-cases-to-protect-your-new-smartphone-from-usd19</link>
                                                                            <description>
                            <![CDATA[ Samsung's much-anticipated Galaxy Z Fold 8 and Fold 8 Ultra have finally been revealed. Keep them pristine with one of these cases, available from Samsung and a range of third party brands. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">YguDVd6uQAUNGaNoy3VaQf</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/NamULQZE5qszUkUT6MD83X-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 11:52:46 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Will Salmon ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/HpRWP7Mh9ErgRGoTvZBbBJ-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Will Salmon is Tom&#039;s Guide&#039;s Collections Editor, curating advice on the best products to spend your money on. Will has been writing about tech and entertainment for almost 20 years, including stints as GamesRadar+&#039;s Streaming Editor, editing comics website Newsarama, and writing for lots and lots of magazines.&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/NamULQZE5qszUkUT6MD83X-1920-80.jpg">
                                                            <media:credit><![CDATA[Samsung / Edited by Gemini]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[A selection of cases for the Samsung Galaxy Fold 8.]]></media:description>                                                            <media:text><![CDATA[A selection of cases for the Samsung Galaxy Fold 8.]]></media:text>
                                <media:title type="plain"><![CDATA[A selection of cases for the Samsung Galaxy Fold 8.]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/NamULQZE5qszUkUT6MD83X-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung has officially revealed its highly-anticipated new Galaxy Z Fold 8 and Fold 8 Ultra smartphones. These feature-packed devices offer big foldout screens with crystal clear picture quality, housed in lightweight but durable handsets.</p><p>As you might expect for such hyped bits of kit, the Fold 8 and Fold 8 Ultra come with a fairly hefty price tag. Picking up a phone case is essential, then — and the good news is that there are already options available, which you can see below. </p><p>I've included Samsung's official Galaxy Z Fold 8 case, of course, but I've also picked out a selection of some of the best-looking cases from third party brands. There's something for every budget.</p>        <div class="featured_product_block featured_block_hero" data-id="d22d032e-8678-11f1-a6b9-a3f29890a8bc">            <a href="https://www.amazon.com/Hensinple-Compatible-Translucent-Protection-Shockproof/dp/B0H2LS9P6T/" data-model-name="Hensinple case for Galaxy Z Fold 8 Ultra" 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/xcxjQi3pSNRBMAxwVsD9wk.jpg" alt="Hensinple for Samsung Galaxy Z Fold 8 Ultra Case,z Fold 7| Z Fold8 Ultra Case [compatible With Magsafe] Translucent Matte Military Grade Protection Shockproof Rugged Magnetic Phone Cover(black)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Hensinple</div>                                        <div class="featured__title">Hensinple case for Galaxy Z Fold 8 Ultra</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d03b0-8678-11f1-ac11-9fb2a544123f">            <a href="https://www.amazon.com/FNTCASE-Samsung-Galaxy-Fold-Ultra/dp/B0GZ2XHVMF/" data-model-name="Fntcase case for Galaxy Z Fold 8 Ultra" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:96.60%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/UbmyWVQkckmdpH4C5qoNPm.jpg" alt="Fntcase for Samsung Galaxy Z Fold 8 Ultra Case: Galaxy Z Fold 7 Case [hinge Protection + Screen Protector] [fit for Magsafe] Military Grade Drop Protective, Translucent Matte Phone Cover - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>FNTCASE</div>                                        <div class="featured__title">Fntcase case for Galaxy Z Fold 8 Ultra</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d0428-8678-11f1-aacf-677eb828f83a">            <a href="https://www.amazon.com/Spigen-Armor-MagFit-Galaxy-Black/dp/B0GMVFRFYL/" data-model-name="Spigen Slim Armor Pro Magfit case for Galaxy Z Fold 8" 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/oayMnNBmzvBm5cQpDBunpm.jpg" alt="Spigen Slim Armor Pro Magfit for Galaxy Z Fold 8 Case, Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Spigen</div>                                        <div class="featured__title">Spigen Slim Armor Pro Magfit case for Galaxy Z Fold 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d0496-8678-11f1-82dc-a3c08d2e6a05">            <a href="https://www.ringkestore.com/products/galaxy-z-fold-8-case-onyx-flap-magnetic-screen-protectors-2p" data-model-name="Ringke Magnetic case and Screen Protectors for Galaxy Z Fold 8" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:116.28%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/J8uFt5kf7bZPoG8cyEBDZn.jpg" alt="[bundle] Galaxy Z Fold 8 | Onyx Flap Magnetic + Screen Protectors (2p) - Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Ringke Official Store</div>                                        <div class="featured__title">Ringke Magnetic case and Screen Protectors for Galaxy Z Fold 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d050e-8678-11f1-896f-7ba3a273eae1">            <a href="https://www.ringkestore.com/products/bundle-galaxy-z-fold-8-fusion-flap-magnetic-cover-display-easy-slide-tempered-glass-2p" data-model-name="Ringke Fusion Magnetic case and Screen Protectors for Galaxy Z Fold 8" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:116.28%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/9onKsGSChRTTfZpqpbhnqn.jpg" alt="[bundle] Galaxy Z Fold 8 | Fusion Flap Magnetic + Screen Protectors (2p)"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Ringke Official Store</div>                                        <div class="featured__title">Ringke Fusion Magnetic case and Screen Protectors for Galaxy Z Fold 8</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d05fe-8678-11f1-b382-1366c6cc9c31">            <a href="https://thinborne.com/collections/galaxy-z-fold-8-ultra-case/products/galaxy-z-fold-8-ultra-case-red" data-model-name="ThinBorne case for Galaxy Z Fold 8 Ultra" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/TLef97VMzfqqH4tvqQ48BZ.jpg" alt="ThinBorne, ThinBorne case for Galaxy Z Fold8 Ultra"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>ThinBorne</div>                                        <div class="featured__title">ThinBorne case for Galaxy Z Fold 8 Ultra</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="69e341e4-867c-11f1-abd1-bbc8e9457508">            <a href="https://www.otterbox.com/products/galaxy-z-fold8-defender-series-pro-xt-case?variant=48109838696635" data-model-name="OtterBox Galaxy Z Fold 8 Defender Series Case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/BAZGMPw9nCiroXK5LQKtKK.jpg" alt="OtterBox, OtterBox Galaxy Z Fold 8 Defender Series Case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>OtterBox</div>                                        <div class="featured__title">OtterBox Galaxy Z Fold 8 Defender Series Case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d0676-8678-11f1-9713-0b4f4a7cb824">            <a href="https://www.amazon.com/TORRAS-Galaxy-Fold-Ultra-Samsung/dp/B0H2ZKRVPL/" data-model-name="Torras Vegskin for Galaxy Z Fold 8 Ultra Case Leather" 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/vgvYfBVk9Zh2KyZcjADei.jpg" alt="Torras Q3 Vegskin for Galaxy Z Fold 8 Ultra Case Leather, 360 Spin Magnetic Stand, Fit for Magsafe, Hinge Protection, Organic Silicone Leather Resists Stains, Slim Case for Samsung Fold8 Ultra, Black"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>TORRAS</div>                                        <div class="featured__title">Torras Vegskin for Galaxy Z Fold 8 Ultra Case Leather</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>        <div class="featured_product_block featured_block_hero" data-id="d22d06e4-8678-11f1-bc76-c35b29b2c395">            <a href="https://www.samsung.com/us/mobile-accessories/phones/galaxy-z-fold8-carbon-magnet-case-black-sku-ef-kf971sbegus/" data-model-name="Samsung Galaxy Z Fold 8 Carbon Magnet Case" data-model-brand="" ><div class='product-image-widthsetter'><p class='vanilla-image-block' data-bordeaux-image-check style='padding-top:133.33%';><img style="width: 100%" class="featured_image" src="https://cdn.mos.cms.futurecdn.net/JHoeot8yzeM6T27GpDRepb.jpg" alt="Samsung, Samsung Galaxy Z Fold8 Carbon Magnet Case"></p></div></a>            <div class="featured_product_details_wrapper">                <div class="featured_product_title_wrapper">                                        <div class='featured__brand'>Samsung</div>                                        <div class="featured__title">Samsung Galaxy Z Fold 8 Carbon Magnet Case</div>                                    </div>                <div class="subtitle__description">                                                            <p></p>                </div>                            </div>        </div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ T-Mobile is offering a free Galaxy Z Fold 8: how to save up to $1,900 on Samsung's new foldables ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung's Galaxy Z line of foldable phones are among the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> we've tested. They're known for being sturdy, incredibly powerful, and fun to use. Samsung just released its Galaxy Z lineup for 2026 and it consists of the Galaxy Z Fold 8 Ultra for $2,099, Galaxy Z Fold 8 for $1,899, and the Galaxy Z Flip 8 for $1,199. </p><p>Preorder deals are already live and one carrier is taking the lead when it comes to discounts. Right now, you can get the <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">Galaxy Z Fold 8 for free</a> or <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">up to $1,100 off the Galaxy Z Fold 8 Ultra</a> at T-Mobile. Alternatively, you can get <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">up to $1,100 off the Galaxy Z Flip 8</a>. All of these offers require a trade-in and you must also sign up for the carrier's Experience More or Experience Beyond plans. Nevertheless, they're the most aggressive discounts I've seen so far. </p><p>Here's a look at each individual deal and all of Samsung's new phones. For more personal recommendations, make sure to check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> homepage and our <a href="https://www.tomsguide.com/news/ultimate-back-to-school-guide">back to school deals</a> guide. Also make sure to bookmark our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Galaxy Z Fold 8 preorder deals</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/best-galaxy-z-flip-8-deals-get-samsungs-new-foldable-for-free">Galaxy Z Flip 8 preorder deals</a> for the latest discounts.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>shop all Samsung deals at T-Mobile</strong></a></li><li><strong>Galaxy Z Fold 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>free w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>up to $1,900 off w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Galaxy Z Flip 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>up to $1,100 off w/ trade-in + unlimited</strong></a><strong></strong></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-best-galaxy-z-deals"><span>Best Galaxy Z deals</span></h3><div class="product"><a data-dimension112="1a6bfb02-8603-11f1-b50e-15e8e6238708" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfb02-8603-11f1-b50e-15e8e6238708" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>free w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get the Galaxy Z Fold 8 for free with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. The phone features a 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8 hands-on</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but multitasking is way more suitable on its canvas, with up to four apps running simultaneously.<a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfb02-8603-11f1-b50e-15e8e6238708" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="1a6bfb70-8603-11f1-bc61-618752e68108" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfb70-8603-11f1-bc61-618752e68108" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,900 off w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get up to $1,900 off the Galaxy Z Fold 8 Ultra with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. The phone features an 8-inch AMOLED (2504 x 2256) 120Hz main display, 6.5-inch AMOLED (1080 x 2520) 120Hz cover display, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. On the rear you get a 200MP main wide-angle lens, 50MP ultra-wide lens, and 10MP telephoto lens (3x optical). Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra hands-on</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfb70-8603-11f1-bc61-618752e68108" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="1a6bfbd4-8603-11f1-90cc-97c9a221308a" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1199px;"><p class="vanilla-image-block" style="padding-top:125.10%;"><img id="rTkAPNzBbP77RUVHtMufoZ" name="Galaxy Z Flip 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rTkAPNzBbP77RUVHtMufoZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1199" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfbd4-8603-11f1-90cc-97c9a221308a" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,100 off w/ tarde-in + unlimited @ T-Mobile</strong></a><br>T-Mobile is offering various Galaxy Z Flip 8 deals. You can get the phone for $1,100 off with trade-in and when you add a line on T-Mobile's Experience More or Experience Beyond plans. Or get it for $500 off with trade-in on most other data plans. The flip phone features a 6.9-inch AMOLED (1080 x 2520) inner display w/ 120Hz refresh, 4.1-inch AMOLED (948 x 1048) outer display w/ 120Hz refresh, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. You also get 50MP f/1.8 main and 12MP f/2.2 ultra-wide rear cameras and a 10MP f2.2 selfie cam. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 hands-on</a>, we said it's Samsung's sleekest and most refined flip phone to date, but not a necessary upgrade for current Z Flip 7 owners.<a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfbd4-8603-11f1-90cc-97c9a221308a" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/t-mobile-is-offering-a-free-galaxy-z-fold-8-how-to-save-up-to-usd1-900-on-samsungs-new-foldables</link>
                                                                            <description>
                            <![CDATA[ T-Mobile is offering some of the best Galaxy Z Fold 8 and Galaxy Z Flip 8 preorder deals I've seen. Here's how you can save up to $1,900 ahead of launch. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">LXctkSaN9s7tXRFMxhB5i6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/4XpU9Fp9xSimdZVUBeEvsF-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 11:30:00 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5-320-70.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks&amp;nbsp;against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more.&amp;nbsp;He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/4XpU9Fp9xSimdZVUBeEvsF-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Fold 8 Ultra, Z Fold 8, and Z Flip 8 phones held in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Fold 8 Ultra, Z Fold 8, and Z Flip 8 phones held in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Fold 8 Ultra, Z Fold 8, and Z Flip 8 phones held in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/4XpU9Fp9xSimdZVUBeEvsF-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung's Galaxy Z line of foldable phones are among the <a href="https://www.tomsguide.com/best-picks/best-foldable-phones">best foldable phones</a> we've tested. They're known for being sturdy, incredibly powerful, and fun to use. Samsung just released its Galaxy Z lineup for 2026 and it consists of the Galaxy Z Fold 8 Ultra for $2,099, Galaxy Z Fold 8 for $1,899, and the Galaxy Z Flip 8 for $1,199. </p><p>Preorder deals are already live and one carrier is taking the lead when it comes to discounts. Right now, you can get the <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">Galaxy Z Fold 8 for free</a> or <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">up to $1,100 off the Galaxy Z Fold 8 Ultra</a> at T-Mobile. Alternatively, you can get <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">up to $1,100 off the Galaxy Z Flip 8</a>. All of these offers require a trade-in and you must also sign up for the carrier's Experience More or Experience Beyond plans. Nevertheless, they're the most aggressive discounts I've seen so far. </p><p>Here's a look at each individual deal and all of Samsung's new phones. For more personal recommendations, make sure to check out the <a href="https://www.tomsguide.com/savings-squad">Tom's Guide Savings Squad</a> homepage and our <a href="https://www.tomsguide.com/news/ultimate-back-to-school-guide">back to school deals</a> guide. Also make sure to bookmark our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Galaxy Z Fold 8 preorder deals</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/best-galaxy-z-flip-8-deals-get-samsungs-new-foldable-for-free">Galaxy Z Flip 8 preorder deals</a> for the latest discounts.</p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>shop all Samsung deals at T-Mobile</strong></a></li><li><strong>Galaxy Z Fold 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>free w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Galaxy Z Fold 8 Ultra: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>up to $1,900 off w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Galaxy Z Flip 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>up to $1,100 off w/ trade-in + unlimited</strong></a><strong></strong></li></ul><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h3 class="article-body__section" id="section-best-galaxy-z-deals"><span>Best Galaxy Z deals</span></h3><div class="product"><a data-dimension112="1a6bfb02-8603-11f1-b50e-15e8e6238708" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:954px;"><p class="vanilla-image-block" style="padding-top:98.95%;"><img id="4EngEpxMLxWVDrp7aAo2xi" name="Galaxy Z Fold 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4EngEpxMLxWVDrp7aAo2xi-1920-80.jpg" mos="" align="middle" fullscreen="" width="954" height="944" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 preorder: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfb02-8603-11f1-b50e-15e8e6238708" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>free w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get the Galaxy Z Fold 8 for free with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. The phone features a 7.6-inch AMOLED (1848 x 2448) 120Hz main display, 5.5-inch AMOLED (1248 x 1972) 120Hz cover display, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. On the rear you get a 50MP main wide-angle lens and 50MP ultra-wide lens. Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8 hands-on</a>, we called it our favorite foldable to date. It loses the telephoto zoom, but multitasking is way more suitable on its canvas, with up to four apps running simultaneously.<a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfb02-8603-11f1-b50e-15e8e6238708" data-action="Deal Block" data-label="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 preorder: free w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="1a6bfb70-8603-11f1-bc61-618752e68108" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1327px;"><p class="vanilla-image-block" style="padding-top:64.28%;"><img id="9Rhpe6TtrVFSNo9Vtn27Tm" name="Galaxy Z Fold 8 Ultra deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/9Rhpe6TtrVFSNo9Vtn27Tm-1920-80.jpg" mos="" align="middle" fullscreen="" width="1327" height="853" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Fold 8 Ultra preorder: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfb70-8603-11f1-bc61-618752e68108" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,900 off w/ trade-in + unlimited @ T-Mobile</strong></a><br>New and existing T-Mobile customers can get up to $1,900 off the Galaxy Z Fold 8 Ultra with trade-in and Experience Beyond data plans. Or you'll get up to $1,100 off with trade-in and on Experience More plans. Other discounts are also available for other plans. The phone features an 8-inch AMOLED (2504 x 2256) 120Hz main display, 6.5-inch AMOLED (1080 x 2520) 120Hz cover display, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. On the rear you get a 200MP main wide-angle lens, 50MP ultra-wide lens, and 10MP telephoto lens (3x optical). Selfie cams include a 10MP main display and 10MP cover camera. In our <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra hands-on</a>, we said its greatly reduced crease, upgraded silicon carbon battery, faster charging, and upgraded ultrawide camera make it a meaningful upgrade.<a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfb70-8603-11f1-bc61-618752e68108" data-action="Deal Block" data-label="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Fold 8 Ultra preorder: up to $1,900 off w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="1a6bfbd4-8603-11f1-90cc-97c9a221308a" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1199px;"><p class="vanilla-image-block" style="padding-top:125.10%;"><img id="rTkAPNzBbP77RUVHtMufoZ" name="Galaxy Z Flip 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rTkAPNzBbP77RUVHtMufoZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1199" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfbd4-8603-11f1-90cc-97c9a221308a" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,100 off w/ tarde-in + unlimited @ T-Mobile</strong></a><br>T-Mobile is offering various Galaxy Z Flip 8 deals. You can get the phone for $1,100 off with trade-in and when you add a line on T-Mobile's Experience More or Experience Beyond plans. Or get it for $500 off with trade-in on most other data plans. The flip phone features a 6.9-inch AMOLED (1080 x 2520) inner display w/ 120Hz refresh, 4.1-inch AMOLED (948 x 1048) outer display w/ 120Hz refresh, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. You also get 50MP f/1.8 main and 12MP f/2.2 ultra-wide rear cameras and a 10MP f2.2 selfie cam. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 hands-on</a>, we said it's Samsung's sleekest and most refined flip phone to date, but not a necessary upgrade for current Z Flip 7 owners.<a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="1a6bfbd4-8603-11f1-90cc-97c9a221308a" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ tarde-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I just ditched my iPhone for the Z Fold 8 — Android 17’s new migration tool is pure magic, but there is one painful catch ]]></title>
                                                                                                <dc:content><![CDATA[ <p>For a decade, Apple has essentially held my digital life hostage with iPhones. Every time I looked at an Android phone, the sheer dread of migrating my passwords, WhatsApp chats, and app layouts kept me firmly trapped in the Walled Garden. But with Android 17 on the new <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Fold 8</a>, Google just handed me a pair of bolt cutters.</p><p>Enter Google’s new Android Switch iOS migration tool — named Smart Switch in the newly launched Galaxy Z Fold 8, <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a>. And all I’ll say is if switching operating systems is a dealbreaker for you — getting all the right apps, account logins and home screen layouts just right — all of that is gone.</p><p>This is a breakthrough for phone switchers, and a real leveler in the iOS vs Android war.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="just-scan-and-go">Just scan and go</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uat8NzYTFwXMac58yd9osY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/uat8NzYTFwXMac58yd9osY-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It all starts with a QR code scan — no additional app required. At that point, I picked what apps and data I sent across, and it just…did it. Mostly.</p><p>There is the brutal reality I did face while switching: the software is pure magic, but physics still applies. I was staring down the barrel of a decade's worth of iPhone photos (514GB to be specific), and the Z Fold 8 simply didn't have the storage to swallow it all. </p><p>I had to make the agonizing choice to leave my photo library behind in the Apple ether. But once I made peace with that (and started a mass transfer to Amazon Photos with my Prime account)? What happened next was jaw-dropping.</p><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="VikpkEk9PUNfF4iqZtMNqY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/VikpkEk9PUNfF4iqZtMNqY-1920-80.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><div><blockquote><p>The elimination of basically all friction here is amazing to me.</p></blockquote></div><p>Your Android phone will find its OS equivalents of the apps you have on your iPhone and install them all, all your messages, call logs and contacts, WhatsApp data, account logins and passwords, settings and even the way the apps are laid out on each home screen (as well as wallpaper) all make it over.</p><p>The only things you’ll need to do are log back into your apps with the saved details and add the Android equivalent to the widgets, as I saw with these suspicious gaps in my app layouts. </p><p>The elimination of basically all friction here is amazing to me — someone who’s seen both sides make it as awkward as possible for platform lock-in.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="D4SjJtUfCtdf2rEXwMZ5sY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/D4SjJtUfCtdf2rEXwMZ5sY-1920-80.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>And even better? It just took me around 25-30 minutes wirelessly. Of course, mileage may vary depending on just how much data you’re sending over, but this was for roughly 55GB of total data. </p><p>Stick another five minutes on top for logging back into everything and setting up my bank card with Samsung Pay, and I was using the London Underground again as if nothing had happened.</p><h2 id="what-s-the-catch">What’s the catch?</h2><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="9ziYTMeYfvJiwhcom72gqY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/9ziYTMeYfvJiwhcom72gqY-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So there is one small frustration that I came across — my first attempt came up with an internet connection problem. Basically, the migration didn’t start because the Android phone wasn’t connected to Wi-Fi. This could be because I was on my hotel’s network, and your home Wi-Fi may behave differently.</p><p>If that happens, just start the process as if you were setting up your Android phone from scratch, connect to Wi-Fi, then head back to the migration screen. That fixed it for 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MGUksWn6w4Ak5by2oQDaoY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/MGUksWn6w4Ak5by2oQDaoY-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But beyond that, everything else was shockingly smooth on this transition, and surprisingly fast too. In all my years covering phones, I never expected to see iOS and Android playing nice together like this.</p><p>Put simply, the fear of platform lock-in should no longer be part of your purchase decision.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal">Samsung Galaxy Z Fold 8 is the first Galaxy phone with a silicon carbon battery — here's why that's such a big deal</a></li><li><a href="https://www.tomsguide.com/ai/samsung-just-added-automated-tasks-and-gemini-notebook-to-galaxy-z-fold-8-heres-what-these-ai-features-let-you-do">Samsung just added Automated Tasks and Gemini Notebook to Galaxy Z Fold 8 — here's what these AI features let you do</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-held-samsungs-secret-canceled-z-fold-8-prototypes-and-they-killed-the-best-one">I held Samsung’s secret, canceled Z Fold 8 prototypes — and they killed the best one</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-just-ditched-my-iphone-for-the-z-fold-8-android-17s-new-migration-tool-is-pure-magic-but-there-is-one-painful-catch</link>
                                                                            <description>
                            <![CDATA[ I ditched my iPhone of 10 years for the Samsung Galaxy Z Fold 8. Android 17’s new native switch tool is pure magic, but I hit one 514GB storage catch. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">jk4sSf2XqheBuDuZcbEFt</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/bnGCtNgfVm5FaNEyibTdqY-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 10:36:13 +0000</pubDate>                                                                                                                                                                                                                                <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/bnGCtNgfVm5FaNEyibTdqY-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Android 17 iOS migration tool]]></media:description>                                                            <media:text><![CDATA[Android 17 iOS migration tool]]></media:text>
                                <media:title type="plain"><![CDATA[Android 17 iOS migration tool]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/bnGCtNgfVm5FaNEyibTdqY-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>For a decade, Apple has essentially held my digital life hostage with iPhones. Every time I looked at an Android phone, the sheer dread of migrating my passwords, WhatsApp chats, and app layouts kept me firmly trapped in the Walled Garden. But with Android 17 on the new <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Fold 8</a>, Google just handed me a pair of bolt cutters.</p><p>Enter Google’s new Android Switch iOS migration tool — named Smart Switch in the newly launched Galaxy Z Fold 8, <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> and <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8</a>. And all I’ll say is if switching operating systems is a dealbreaker for you — getting all the right apps, account logins and home screen layouts just right — all of that is gone.</p><p>This is a breakthrough for phone switchers, and a real leveler in the iOS vs Android war.</p><figure class="inline-layout"><div style="min-height: 400px;"><fw-embed-feed channel="toms_guide" playlist="5bJZYl" mode="row" player_placement="bottom-right"></fw-embed-feed></div></figure><h2 id="just-scan-and-go">Just scan and go</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="uat8NzYTFwXMac58yd9osY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/uat8NzYTFwXMac58yd9osY-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>It all starts with a QR code scan — no additional app required. At that point, I picked what apps and data I sent across, and it just…did it. Mostly.</p><p>There is the brutal reality I did face while switching: the software is pure magic, but physics still applies. I was staring down the barrel of a decade's worth of iPhone photos (514GB to be specific), and the Z Fold 8 simply didn't have the storage to swallow it all. </p><p>I had to make the agonizing choice to leave my photo library behind in the Apple ether. But once I made peace with that (and started a mass transfer to Amazon Photos with my Prime account)? What happened next was jaw-dropping.</p><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="VikpkEk9PUNfF4iqZtMNqY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/VikpkEk9PUNfF4iqZtMNqY-1920-80.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><div><blockquote><p>The elimination of basically all friction here is amazing to me.</p></blockquote></div><p>Your Android phone will find its OS equivalents of the apps you have on your iPhone and install them all, all your messages, call logs and contacts, WhatsApp data, account logins and passwords, settings and even the way the apps are laid out on each home screen (as well as wallpaper) all make it over.</p><p>The only things you’ll need to do are log back into your apps with the saved details and add the Android equivalent to the widgets, as I saw with these suspicious gaps in my app layouts. </p><p>The elimination of basically all friction here is amazing to me — someone who’s seen both sides make it as awkward as possible for platform lock-in.</p><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="D4SjJtUfCtdf2rEXwMZ5sY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/D4SjJtUfCtdf2rEXwMZ5sY-1920-80.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>And even better? It just took me around 25-30 minutes wirelessly. Of course, mileage may vary depending on just how much data you’re sending over, but this was for roughly 55GB of total data. </p><p>Stick another five minutes on top for logging back into everything and setting up my bank card with Samsung Pay, and I was using the London Underground again as if nothing had happened.</p><h2 id="what-s-the-catch">What’s the catch?</h2><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="9ziYTMeYfvJiwhcom72gqY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/9ziYTMeYfvJiwhcom72gqY-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>So there is one small frustration that I came across — my first attempt came up with an internet connection problem. Basically, the migration didn’t start because the Android phone wasn’t connected to Wi-Fi. This could be because I was on my hotel’s network, and your home Wi-Fi may behave differently.</p><p>If that happens, just start the process as if you were setting up your Android phone from scratch, connect to Wi-Fi, then head back to the migration screen. That fixed it for 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:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="MGUksWn6w4Ak5by2oQDaoY" name="Android 17 iOS migration tool" alt="Android 17 iOS migration tool" src="https://cdn.mos.cms.futurecdn.net/MGUksWn6w4Ak5by2oQDaoY-1920-80.jpg" mos="" align="middle" fullscreen="" width="3840" height="2160" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Future)</span></figcaption></figure><p>But beyond that, everything else was shockingly smooth on this transition, and surprisingly fast too. In all my years covering phones, I never expected to see iOS and Android playing nice together like this.</p><p>Put simply, the fear of platform lock-in should no longer be part of your purchase decision.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-is-the-first-galaxy-phone-with-a-silicon-carbon-battery-heres-why-thats-such-a-big-deal">Samsung Galaxy Z Fold 8 is the first Galaxy phone with a silicon carbon battery — here's why that's such a big deal</a></li><li><a href="https://www.tomsguide.com/ai/samsung-just-added-automated-tasks-and-gemini-notebook-to-galaxy-z-fold-8-heres-what-these-ai-features-let-you-do">Samsung just added Automated Tasks and Gemini Notebook to Galaxy Z Fold 8 — here's what these AI features let you do</a></li><li><a href="https://www.tomsguide.com/phones/samsung-phones/i-held-samsungs-secret-canceled-z-fold-8-prototypes-and-they-killed-the-best-one">I held Samsung’s secret, canceled Z Fold 8 prototypes — and they killed the best one</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ I held Samsung’s secret, canceled Z Fold 8 prototypes — and they killed the best one ]]></title>
                                                                                                <dc:content><![CDATA[ <p>So the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Samsung Galaxy Z Fold 8</a> is official, and it’s the next foldable to jump on the passport-sized trend with a shorter, wider form factor that makes it ideal for content consumption.</p><p>I do like it from my time testing it (bar that $1,899 price tag). Some of the ergonomic issues I saw with <a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">Huawei’s stubby foldable</a> have been resolved in software, and having a nicer 4:3 aspect ratio gives your Netflix shows or websites much more screen space to fill than the squarer Z Fold 8 Ultra.</p><p>I had a chance to speak to Samsung’s design team head, Hubert Lee, about the decisions made to get to this form factor, and I got to hold some of the different-sized devices that were left on the cutting room floor. And…well…is this a safe space? Because I think they’ve dropped the ball by not going for something smaller here.</p><h2 id="the-story-of-the-design">The story of the design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4592px;"><p class="vanilla-image-block" style="padding-top:62.13%;"><img id="NvoNz7r4QZg4mgbVGEuTUX" name="Galaxy Z Fold 8-10" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/NvoNz7r4QZg4mgbVGEuTUX-1920-80.jpg" mos="" align="middle" fullscreen="" width="4592" height="2853" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>So how did Samsung land on the Z Fold 8? Well, it’s a long story of trying to balance emotional warmth and geometric symmetry — a mission that Lee labels “Emotive Geometry” — alongside 3D printing many different form factors for this new stubbier foldable.</p><p>After much experimentation with over 500 handmade mock-ups to evaluate grip, comfort and usability across different sizes and proportions, it became clear to the team that drawing inspiration from the passport was (in their words) a golden ratio.</p><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="A86qjy3wnqzTu5MECrnR4m" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/A86qjy3wnqzTu5MECrnR4m-1920-80.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><ul><li>Smaller versions aimed at users with smaller hands were tested, but ultimately scrapped because they felt too similar to the Galaxy Z Flip 8</li><li>Larger versions were also rejected because they were too close to the Z Fold 8 Ultra</li></ul><p>And in the same spirit as Goldilocks trying out different beds and bowls of porridge, the company stumbled on what they believe is “just right.” Its ergonomic dimensions are specifically designed to be held and opened with a single hand, while being compact enough to be pocketable. And in my time using it, I can see how they arrived at that decision. </p><p>Yes, I’m a little disappointed that there’s still black bars with the 4:3 aspect ratio inside display, but you certainly get a lot more content on screen than you would with the productivity-focused <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a>.</p><p>But as I was shown these mockups, and got to hold them, I was left asking one question: did they make the right decision? I’m really not sure.</p><h2 id="how-small-can-you-go">How small can you go?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4mbfAbyYPXhknkjSMyvysk" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/4mbfAbyYPXhknkjSMyvysk-1920-80.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’ll admit this comes from a biased place. I loved my <a href="https://www.tomsguide.com/reviews/iphone-12-mini">iPhone 12 mini</a> and have always adored having smaller smartphones over the gigantic slabs that they’ve all become. So once I started holding these tiny options, my mind was spinning with the possibilities of what could’ve been.</p><p>Because yes, that smallest device is basically a Z Flip 8 turned sideways, but it also meant a 16:9 aspect ratio display inside — no black bezels whatsoever on your content! But if you still really wanted the same aspect ratios as the finished product, you’ve got smaller options that felt amazing in one hand.</p><p>Simply put, there's a lot more room for aspect ratio experimentation if content consumption was the key mission here, and I think Samsung's really missed an opportunity here to do something that breaks new ground.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Pze3QLnSE96RoMfRW8WE5m-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/n8kZboSvuxAk6bpQReLD4m-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Now, I know what one of your many responses will be here. “What about battery life?” As you already know, there’s a 4,800mAh silicon carbon cell inside to maximize the balance between longevity and making this the lightest Galaxy Fold. </p><p>With that technology (and a touch more thickness), it could be argued that you could still find that good balance. We’ve seen standard smartphones go all the way up to 7,000mAh with this new battery tech, so it’s not fantasy to believe the same could happen here.</p><h2 id="take-me-back-to-small-phones">Take me back to small phones</h2><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="PY9Dr9HgLSZZPXvkKDujuk" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/PY9Dr9HgLSZZPXvkKDujuk-1920-80.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 know I may be in a minority here — after all, every time a company tried to make a small phone, they quickly pivoted to big screens (RIP iPhone mini). However, foldables give you the best of both worlds, and while I do appreciate the intentional choice of Samsung here, I feel there was a better golden ratio right in front of them.</p><p>Passport-sized foldables are definitely all the rage right now, as Apple looks set to join this party real soon. But holding these smaller options sent my mind spinning on what could’ve been.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-card-takes-aim-at-apple-card-with-way-more-perks-and-rewards-heres-what-you-get">Samsung Galaxy Card takes aim at Apple Card with way more perks and rewards — here’s what you get</a></li><li><a href="https://www.tomsguide.com/phones/iphones/forget-iphone-18-pro-iphone-20-tipped-to-get-apples-biggest-screen-upgrade-ever">Forget iPhone 18 Pro — iPhone 20 tipped to get Apple’s biggest screen upgrade ever</a></li><li><a href="https://www.tomsguide.com/phones/android-phones/light-just-announced-a-usd299-flip-phone-to-cure-screen-addiction-and-its-co-founder-convinced-me-to-embrace-being-bored-again">Light just announced a $299 flip phone to cure screen addiction — and its co-founder convinced me to embrace being bored again</a></li></ul> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/i-held-samsungs-secret-canceled-z-fold-8-prototypes-and-they-killed-the-best-one</link>
                                                                            <description>
                            <![CDATA[ I spoke to Samsung design head Hubert Lee about the Galaxy Z Fold 8's passport shape and tested the scrapped prototypes left on the cutting room floor. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">WHogwYPbRzkTnzNqaxmSNd</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/sTwjm7kCjJhCc8oFYZSz5m-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 04:00:00 +0000</pubDate>                                                                                                                                <updated>Thu, 23 Jul 2026 06:42:01 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Jason England ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/v4fSq5U4uZUEtGY2BwNuJ6-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Jason brings a decade of tech and gaming journalism experience to his role as a Managing Editor of Computing at Tom&#039;s Guide. He has previously written for Laptop Mag, Tom&#039;s Hardware, Kotaku, Stuff and BBC Science Focus. In his spare time, you&#039;ll find Jason looking for good dogs to pet or thinking about eating pizza if he isn&#039;t already.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/sTwjm7kCjJhCc8oFYZSz5m-1920-80.jpg">
                                                            <media:credit><![CDATA[Future]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/sTwjm7kCjJhCc8oFYZSz5m-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>So the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Samsung Galaxy Z Fold 8</a> is official, and it’s the next foldable to jump on the passport-sized trend with a shorter, wider form factor that makes it ideal for content consumption.</p><p>I do like it from my time testing it (bar that $1,899 price tag). Some of the ergonomic issues I saw with <a href="https://www.tomsguide.com/phones/iphones/i-just-tested-the-phone-everybody-thinks-is-a-preview-of-the-iphone-fold-god-i-hope-theyre-wrong">Huawei’s stubby foldable</a> have been resolved in software, and having a nicer 4:3 aspect ratio gives your Netflix shows or websites much more screen space to fill than the squarer Z Fold 8 Ultra.</p><p>I had a chance to speak to Samsung’s design team head, Hubert Lee, about the decisions made to get to this form factor, and I got to hold some of the different-sized devices that were left on the cutting room floor. And…well…is this a safe space? Because I think they’ve dropped the ball by not going for something smaller here.</p><h2 id="the-story-of-the-design">The story of the design</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4592px;"><p class="vanilla-image-block" style="padding-top:62.13%;"><img id="NvoNz7r4QZg4mgbVGEuTUX" name="Galaxy Z Fold 8-10" alt="Galaxy Z Fold 8 shown in hand" src="https://cdn.mos.cms.futurecdn.net/NvoNz7r4QZg4mgbVGEuTUX-1920-80.jpg" mos="" align="middle" fullscreen="" width="4592" height="2853" attribution="" endorsement="" class="inline"></p></div></div><figcaption itemprop="caption description" class=" inline-layout"><span class="credit" itemprop="copyrightHolder">(Image credit: Tom's Guide)</span></figcaption></figure><p>So how did Samsung land on the Z Fold 8? Well, it’s a long story of trying to balance emotional warmth and geometric symmetry — a mission that Lee labels “Emotive Geometry” — alongside 3D printing many different form factors for this new stubbier foldable.</p><p>After much experimentation with over 500 handmade mock-ups to evaluate grip, comfort and usability across different sizes and proportions, it became clear to the team that drawing inspiration from the passport was (in their words) a golden ratio.</p><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="A86qjy3wnqzTu5MECrnR4m" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/A86qjy3wnqzTu5MECrnR4m-1920-80.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><ul><li>Smaller versions aimed at users with smaller hands were tested, but ultimately scrapped because they felt too similar to the Galaxy Z Flip 8</li><li>Larger versions were also rejected because they were too close to the Z Fold 8 Ultra</li></ul><p>And in the same spirit as Goldilocks trying out different beds and bowls of porridge, the company stumbled on what they believe is “just right.” Its ergonomic dimensions are specifically designed to be held and opened with a single hand, while being compact enough to be pocketable. And in my time using it, I can see how they arrived at that decision. </p><p>Yes, I’m a little disappointed that there’s still black bars with the 4:3 aspect ratio inside display, but you certainly get a lot more content on screen than you would with the productivity-focused <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Z Fold 8 Ultra</a>.</p><p>But as I was shown these mockups, and got to hold them, I was left asking one question: did they make the right decision? I’m really not sure.</p><h2 id="how-small-can-you-go">How small can you go?</h2><figure class="van-image-figure  inline-layout" data-bordeaux-image-check ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3840px;"><p class="vanilla-image-block" style="padding-top:56.25%;"><img id="4mbfAbyYPXhknkjSMyvysk" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/4mbfAbyYPXhknkjSMyvysk-1920-80.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’ll admit this comes from a biased place. I loved my <a href="https://www.tomsguide.com/reviews/iphone-12-mini">iPhone 12 mini</a> and have always adored having smaller smartphones over the gigantic slabs that they’ve all become. So once I started holding these tiny options, my mind was spinning with the possibilities of what could’ve been.</p><p>Because yes, that smallest device is basically a Z Flip 8 turned sideways, but it also meant a 16:9 aspect ratio display inside — no black bezels whatsoever on your content! But if you still really wanted the same aspect ratios as the finished product, you’ve got smaller options that felt amazing in one hand.</p><p>Simply put, there's a lot more room for aspect ratio experimentation if content consumption was the key mission here, and I think Samsung's really missed an opportunity here to do something that breaks new ground.</p><figure role="gallery"><figure><img src="https://cdn.mos.cms.futurecdn.net/Pze3QLnSE96RoMfRW8WE5m-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure><figure><img src="https://cdn.mos.cms.futurecdn.net/n8kZboSvuxAk6bpQReLD4m-1920-80.jpg" alt="Samsung Galaxy Z Fold 8" /><figcaption><small role="credit">Future</small></figcaption></figure></figure><p>Now, I know what one of your many responses will be here. “What about battery life?” As you already know, there’s a 4,800mAh silicon carbon cell inside to maximize the balance between longevity and making this the lightest Galaxy Fold. </p><p>With that technology (and a touch more thickness), it could be argued that you could still find that good balance. We’ve seen standard smartphones go all the way up to 7,000mAh with this new battery tech, so it’s not fantasy to believe the same could happen here.</p><h2 id="take-me-back-to-small-phones">Take me back to small phones</h2><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="PY9Dr9HgLSZZPXvkKDujuk" name="Samsung Galaxy Z Fold 8" alt="Samsung Galaxy Z Fold 8" src="https://cdn.mos.cms.futurecdn.net/PY9Dr9HgLSZZPXvkKDujuk-1920-80.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 know I may be in a minority here — after all, every time a company tried to make a small phone, they quickly pivoted to big screens (RIP iPhone mini). However, foldables give you the best of both worlds, and while I do appreciate the intentional choice of Samsung here, I feel there was a better golden ratio right in front of them.</p><p>Passport-sized foldables are definitely all the rage right now, as Apple looks set to join this party real soon. But holding these smaller options sent my mind spinning on what could’ve been.</p><h3 class="article-body__section" id="section-more-from-tom-s-guide"><span>More from Tom's Guide</span></h3><ul><li><a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-card-takes-aim-at-apple-card-with-way-more-perks-and-rewards-heres-what-you-get">Samsung Galaxy Card takes aim at Apple Card with way more perks and rewards — here’s what you get</a></li><li><a href="https://www.tomsguide.com/phones/iphones/forget-iphone-18-pro-iphone-20-tipped-to-get-apples-biggest-screen-upgrade-ever">Forget iPhone 18 Pro — iPhone 20 tipped to get Apple’s biggest screen upgrade ever</a></li><li><a href="https://www.tomsguide.com/phones/android-phones/light-just-announced-a-usd299-flip-phone-to-cure-screen-addiction-and-its-co-founder-convinced-me-to-embrace-being-bored-again">Light just announced a $299 flip phone to cure screen addiction — and its co-founder convinced me to embrace being bored again</a></li></ul>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Samsung Galaxy Z Fold 8 deals — top plans and offers in Australia ]]></title>
                                                                                                <dc:content><![CDATA[ <p>Samsung's new Galaxy Z Fold 8 lineup has now been released, marking the end of the pre-order window. If you missed out on all the great pre-order bonuses that were up for grabs in the lead up to launch, don't worry — we're here to help you find the best Galaxy Z Fold 8 deals that currently available in Australia.</p><p>The new <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a> is arguably the star of the show, adopting a shorter, wider, passport‑like shape with a 5.5‑inch cover screen and a 7.6‑inch main display, while the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> keeps the taller, classic layout with a 6.5‑inch cover screen and an 8‑inch main display.</p><p>But that's not all that's new this year: the Galaxy Z Fold 8 and the Z Fold 8 Ultra boast Samsung's new Flex Titanium display, which adds a flexible titanium‑alloy film under the foldable OLED panel to increase durability and significantly reduce the crease on both devices.</p><p>Maybe the biggest change is Samsung finally adopting silicon‑carbon batteries for both the Galaxy Z Fold 8 and Z Fold 8 Ultra, which raises capacity from last year’s 4,400mAh in the Z Fold 7 to 5,000mAh in the Z Fold 8 Ultra and 4,800mAh in the smaller Z Fold 8. It also brings about faster charging, going from 25W (wired) and 15W (wireless) on the Z Fold 7, to 45W (wired) and 20W (wireless) on the Z Fold 8 range.</p><p>As always, you can nab the new Galaxy Z Fold 8 lineup from Australia's top retailers and telcos, and while it's too late to score a pre-order bonus, it's still possible to score a good deal on one of the new foldables. Here are the best Samsung Galaxy Z plans and offers available right now.</p><p>For more ways to save, check out our guide to today's best <a href="https://www.tomsguide.com/au/coupons/samsung.com">Samsung promo codes</a>.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-deals-and-offers"><span>Galaxy Z Fold 8 deals and offers</span></h3><p>Most retailer offers have evaporated post-launch. However, JB Hi-Fi is still offering a AU$150 JB gift card with Galaxy Z Fold 8 purchases, which is pretty decent.</p><p>For those who prefer paying off the phone over time, the major mobile carriers are cutting hundreds off handset costs on repayment plans. Optus offers a flat AU$600 off any model over 12, 24 or 36 months, while Vodafone drops AU$500 off the device price over 24 or 23 months.</p><div class="product"><a data-dimension112="18ae8f12-84cf-11f1-82fd-83f479b2f616" data-action="Deal Block" data-label="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension48="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" href="https://www.samsung.com/au/smartphones/galaxy-z-fold8/buy/" target="_blank" rel="sponsored"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="g2Lu9U9HTxMfgS4ck3uDBd" name="Samsung-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g2Lu9U9HTxMfgS4ck3uDBd-1920-80.jpg" mos="" align="middle" fullscreen="" width="4000" height="4000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Samsung: </strong><a href="https://www.samsung.com/au/smartphones/galaxy-z-fold8/buy/" target="_blank" data-dimension112="18ae8f12-84cf-11f1-82fd-83f479b2f616" data-action="Deal Block" data-label="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension48="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension25=""><strong>AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit</strong></a></p><p>If you buy straight from Samsung, you can layer a few discounts at checkout. You'll get up to AU$150 off with code <strong>UNFOLD2026</strong> when you bundle the phone with a Samsung ecosystem device until July 25 (which then drops down to AU$50 for the rest of the pre-order period), and an extra AU$150 back if you pay with PayPal. Additionally, you can use the code <strong>TR-FOLD8</strong> to knock AU$200 off 1TB models, and you can get up to AU$150 in bonus trade-in credit. Samsung is also throwing in 3 months of free Samsung Care+ and 10% to 30% off bundled gear like Galaxy Watches and Buds.<a class="view-deal button" href="https://www.samsung.com/au/smartphones/galaxy-z-fold8/buy/" target="_blank" rel="sponsored" data-dimension112="18ae8f12-84cf-11f1-82fd-83f479b2f616" data-action="Deal Block" data-label="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension48="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="18ae8f76-84cf-11f1-8060-8b9b75a29c08" data-action="Deal Block" data-label="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0FDFC3C5P" 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="EaJx7PLL3rAQSY9BEgEGi3" name="Amazon-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EaJx7PLL3rAQSY9BEgEGi3-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Amazon: </strong><a href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0H7X1CQGQ/" target="_blank" data-dimension112="18ae8f76-84cf-11f1-8060-8b9b75a29c08" data-action="Deal Block" data-label="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension25=""><strong>Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra</strong></a></p><p>Amazon is keeping it simple for outright buyers: every pre-order of the <a href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0H7X1CQGQ/">Galaxy Z Fold 8 </a>or <a href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0H7XDB8ZV/" target="_blank">Galaxy Z Fold 8 Ultra</a> comes with a free AU$300 Amazon store credit. If you trade in an old phone, you can also get an Amazon gift card valued up to AU$800. This offer is available until 11:59pm AEST on August 13, 2026.<a class="view-deal button" href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0FDFC3C5P" target="_blank" rel="nofollow" data-dimension112="18ae8f76-84cf-11f1-8060-8b9b75a29c08" data-action="Deal Block" data-label="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="18ae908e-84cf-11f1-8c50-335cd40e3a45" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" href="https://www.jbhifi.com.au/pages/samsung-galaxy-unpacked" 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="dUMxuvDTBa7Tnj2jRqi8ME" name="JB-Hi-Fi-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dUMxuvDTBa7Tnj2jRqi8ME-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>JB Hi-Fi: </strong><a href="https://www.jbhifi.com.au/pages/samsung-galaxy-unpacked" target="_blank" data-dimension112="18ae908e-84cf-11f1-8c50-335cd40e3a45" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension25=""><strong>Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra</strong></a></p><p>JB Hi-Fi offers an easy-to-use retail perk by including a AU$150 JB Hi-Fi Gift Card with all Z Fold 8 and Z Fold 8 Ultra purchases. This makes JB Hi-Fi a decent option for outright buyers, though it's worth noting that the gift card was worth twice as much during the pre-order window. Still, it's better than nothing!<a class="view-deal button" href="https://www.jbhifi.com.au/pages/samsung-galaxy-unpacked" target="_blank" rel="nofollow" data-dimension112="18ae908e-84cf-11f1-8c50-335cd40e3a45" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="18ae8fd0-84cf-11f1-9fce-2d74e41bf1cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-fold8" 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="YwvBBB6x3H2wXEEEevoNYC" name="Optus-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YwvBBB6x3H2wXEEEevoNYC-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Optus: </strong><a href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-fold8" target="_blank" data-dimension112="18ae8fd0-84cf-11f1-9fce-2d74e41bf1cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension25=""><strong>Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months</strong></a></p><p>Optus offers a simplified, model-agnostic plan deal by slashing AU$600 off any model in the lineup (Z Fold 8 or Z Fold 8 Ultra) over the course of a 12-, 24- or 36-month repayment plan. That's slightly less than the $750 saving being offered during the pre-order period, but for a post-release offer, this is a great deal.<a class="view-deal button" href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-fold8" target="_blank" rel="nofollow" data-dimension112="18ae8fd0-84cf-11f1-9fce-2d74e41bf1cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="18ae9034-84cf-11f1-9f13-dbfb2fea9ee9" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-fold8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:550px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="QfajE7yyJxPSmrv4c6Jwv7" name="vodafone logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QfajE7yyJxPSmrv4c6Jwv7-1920-80.jpg" mos="" align="middle" fullscreen="" width="550" height="550" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Vodafone: </strong><a href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-fold8" target="_blank" data-dimension112="18ae9034-84cf-11f1-9f13-dbfb2fea9ee9" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension25=""><strong>Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan</strong></a></p><p>Vodafone knocks AU$500 off both the Z Fold 8 and Z Fold 8 Ultra on 24- or 36-month repayment contracts, which is a great post-release offer for those who missed out on the pre-order window.<a class="view-deal button" href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-fold8" target="_blank" rel="nofollow" data-dimension112="18ae9034-84cf-11f1-9f13-dbfb2fea9ee9" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-z-fold-8-plans"><span>Galaxy Z Fold 8 plans</span></h3><iframe allow="" height="1170" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://tomsguide.whistleout.com.au/Widgets/MobilePhoneSearch/Load?calls=-1&customer=Personal&data=5000&phone=Samsung-Galaxy-Z-Fold8-5G-256GB&sms=-1&maxresults=10&includefeatured=false&hd=Samsung%20Galaxy%20Z%20Fold%208%20Plans%20(256GB)"></iframe><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-plans"><span>Galaxy Z Fold 8 Ultra plans</span></h3><iframe allow="" height="1170" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://tomsguide.whistleout.com.au/Widgets/MobilePhoneSearch/Load?calls=-1&customer=Personal&data=5000&phone=Samsung-Galaxy-Z-Fold8-Ultra-5G-256GB&sms=-1&maxresults=10&includefeatured=false&hd=Samsung%20Galaxy%20Z%20Fold%208%20Ultra%20Plans%20(256GB)"></iframe><h2 id="galaxy-z-fold-8-vs-galaxy-z-fold-8-ultra-what-do-you-get">Galaxy Z Fold 8 vs Galaxy Z Fold 8 Ultra — what do you get?</h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Z Fold 8</p></th><th  ><p>Samsung Galaxy Z Fold 8 Ultra</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From AU$2,699</p></td><td  ><p>From AU$2,999</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong></p></td><td  ><p>7.6 inches AMOLED (1848 x 2448, 1-120Hz)</p></td><td  ><p>8 inches AMOLED (2504 x 2256, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong></p></td><td  ><p>5.5 inches AMOLED (1248 x 1972, 1-120Hz) </p></td><td  ><p>6.5 inches AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB / 16GB</p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB/512GB/1TB</p></td><td  ><p>256GB/512GB/1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP wide, 50MP Ultra wide (10x digital zoom)</p></td><td  ><p>200MP wide, 50MP ultra-wide, 10MP telephoto (3x optical)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover camera</strong></p></td><td  ><p>10MP</p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Main display camera</strong></p></td><td  ><p>10MP (f/2.2)</p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired / 20W wireless</p></td><td  ><p>45W wired / 20W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,800 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>123.9 x 81.9 x 9.7 mm (folded), 161.4 x 123.9 x 4.5 mm (unfolded)</p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.16 inches) unfolded</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>201 grams </p></td><td  ><p>215 grams</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP48</p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong> </p></td><td  ><p>Lavender, Graphite, Cream, Pistachio (online)</p></td><td  ><p>Violet shadow, Cream, Graphite, Violet Green (online exclusive)</p></td></tr></tbody></table></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-fold-8-deals-au</link>
                                                                            <description>
                            <![CDATA[ Samsung's Galaxy Z Fold 8 and Z Fold 8 Ultra are out now —here's what Australia's top retailers and telcos are offering in terms of plans and discounts. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">BXECZ9chMSPqR8pogE2aQ6</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/6tFNrkgCW36DH6KbMFoofK-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Thu, 23 Jul 2026 03:48:56 +0000</pubDate>                                                                                                                                <updated>Fri, 14 Aug 2026 01:37:15 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                                    <dc:creator><![CDATA[ Stephen Lambrechts ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/JN3jEQpqyyt32as8AJJqXe-320-70.jpg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;Stephen Lambrechts is the Managing Editor of Tom&#039;s Guide AU and has written professionally across the categories of tech, film, television and gaming for the last 15 years. Before Tom&#039;s Guide, he spent several years as a Senior Journalist at TechRadar, had a brief stint as Editor in Chief at Official Xbox Magazine Australia, and worked at IGN. He&#039;s also written for such mags and sites as APC, TechLife Australia, T3, FilmInk, Daily Telegraph and AskMen. Additionally, he&#039;s a Tomatometer-approved critic on Rotten Tomatoes, and has offered his tech advice on radio and television.&lt;/p&gt;&lt;p&gt;He&#039;s an expert when it comes to smartphones, TVs, gaming and streaming, having contributed many reviews in each of those categories over the years. Despite his many articles on streaming, he&#039;s a passionate collector of physical media who enjoys listening to vinyl records and acquiring obscure horror movies from the &#039;60s, &#039;70s and 80s. He can usually be seen rocking the latest retro sneaker releases, particularly Air Jordans and Reebok Pumps. Occasionally, he also indulges in other non-hipster stuff, like hiking.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/6tFNrkgCW36DH6KbMFoofK-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / Stephen Lambrechts]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Samsung Galaxy Z Fold 8 and Z Fold 8 Ultra side by side on table with Killer Deals badge overlaid]]></media:description>                                                            <media:text><![CDATA[Samsung Galaxy Z Fold 8 and Z Fold 8 Ultra side by side on table with Killer Deals badge overlaid]]></media:text>
                                <media:title type="plain"><![CDATA[Samsung Galaxy Z Fold 8 and Z Fold 8 Ultra side by side on table with Killer Deals badge overlaid]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/6tFNrkgCW36DH6KbMFoofK-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>Samsung's new Galaxy Z Fold 8 lineup has now been released, marking the end of the pre-order window. If you missed out on all the great pre-order bonuses that were up for grabs in the lead up to launch, don't worry — we're here to help you find the best Galaxy Z Fold 8 deals that currently available in Australia.</p><p>The new <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-hands-on-review">Galaxy Z Fold 8</a> is arguably the star of the show, adopting a shorter, wider, passport‑like shape with a 5.5‑inch cover screen and a 7.6‑inch main display, while the <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-ultra-hands-on-review">Galaxy Z Fold 8 Ultra</a> keeps the taller, classic layout with a 6.5‑inch cover screen and an 8‑inch main display.</p><p>But that's not all that's new this year: the Galaxy Z Fold 8 and the Z Fold 8 Ultra boast Samsung's new Flex Titanium display, which adds a flexible titanium‑alloy film under the foldable OLED panel to increase durability and significantly reduce the crease on both devices.</p><p>Maybe the biggest change is Samsung finally adopting silicon‑carbon batteries for both the Galaxy Z Fold 8 and Z Fold 8 Ultra, which raises capacity from last year’s 4,400mAh in the Z Fold 7 to 5,000mAh in the Z Fold 8 Ultra and 4,800mAh in the smaller Z Fold 8. It also brings about faster charging, going from 25W (wired) and 15W (wireless) on the Z Fold 7, to 45W (wired) and 20W (wireless) on the Z Fold 8 range.</p><p>As always, you can nab the new Galaxy Z Fold 8 lineup from Australia's top retailers and telcos, and while it's too late to score a pre-order bonus, it's still possible to score a good deal on one of the new foldables. Here are the best Samsung Galaxy Z plans and offers available right now.</p><p>For more ways to save, check out our guide to today's best <a href="https://www.tomsguide.com/au/coupons/samsung.com">Samsung promo codes</a>.</p><h3 class="article-body__section" id="section-galaxy-z-fold-8-deals-and-offers"><span>Galaxy Z Fold 8 deals and offers</span></h3><p>Most retailer offers have evaporated post-launch. However, JB Hi-Fi is still offering a AU$150 JB gift card with Galaxy Z Fold 8 purchases, which is pretty decent.</p><p>For those who prefer paying off the phone over time, the major mobile carriers are cutting hundreds off handset costs on repayment plans. Optus offers a flat AU$600 off any model over 12, 24 or 36 months, while Vodafone drops AU$500 off the device price over 24 or 23 months.</p><div class="product"><a data-dimension112="18ae8f12-84cf-11f1-82fd-83f479b2f616" data-action="Deal Block" data-label="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension48="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" href="https://www.samsung.com/au/smartphones/galaxy-z-fold8/buy/" target="_blank" rel="sponsored"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:4000px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="g2Lu9U9HTxMfgS4ck3uDBd" name="Samsung-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/g2Lu9U9HTxMfgS4ck3uDBd-1920-80.jpg" mos="" align="middle" fullscreen="" width="4000" height="4000" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Samsung: </strong><a href="https://www.samsung.com/au/smartphones/galaxy-z-fold8/buy/" target="_blank" data-dimension112="18ae8f12-84cf-11f1-82fd-83f479b2f616" data-action="Deal Block" data-label="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension48="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension25=""><strong>AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit</strong></a></p><p>If you buy straight from Samsung, you can layer a few discounts at checkout. You'll get up to AU$150 off with code <strong>UNFOLD2026</strong> when you bundle the phone with a Samsung ecosystem device until July 25 (which then drops down to AU$50 for the rest of the pre-order period), and an extra AU$150 back if you pay with PayPal. Additionally, you can use the code <strong>TR-FOLD8</strong> to knock AU$200 off 1TB models, and you can get up to AU$150 in bonus trade-in credit. Samsung is also throwing in 3 months of free Samsung Care+ and 10% to 30% off bundled gear like Galaxy Watches and Buds.<a class="view-deal button" href="https://www.samsung.com/au/smartphones/galaxy-z-fold8/buy/" target="_blank" rel="sponsored" data-dimension112="18ae8f12-84cf-11f1-82fd-83f479b2f616" data-action="Deal Block" data-label="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension48="Samsung: AU$200 off for 1TB upgrade, AU$150 off with code + AU$150 cashback with PayPal + bonus trade-in credit" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="18ae8f76-84cf-11f1-8060-8b9b75a29c08" data-action="Deal Block" data-label="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0FDFC3C5P" 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="EaJx7PLL3rAQSY9BEgEGi3" name="Amazon-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/EaJx7PLL3rAQSY9BEgEGi3-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="600" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Amazon: </strong><a href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0H7X1CQGQ/" target="_blank" data-dimension112="18ae8f76-84cf-11f1-8060-8b9b75a29c08" data-action="Deal Block" data-label="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension25=""><strong>Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra</strong></a></p><p>Amazon is keeping it simple for outright buyers: every pre-order of the <a href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0H7X1CQGQ/">Galaxy Z Fold 8 </a>or <a href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0H7XDB8ZV/" target="_blank">Galaxy Z Fold 8 Ultra</a> comes with a free AU$300 Amazon store credit. If you trade in an old phone, you can also get an Amazon gift card valued up to AU$800. This offer is available until 11:59pm AEST on August 13, 2026.<a class="view-deal button" href="https://www.amazon.com.au/Samsung-Version-Foldable-Multitasking-Storage/dp/B0FDFC3C5P" target="_blank" rel="nofollow" data-dimension112="18ae8f76-84cf-11f1-8060-8b9b75a29c08" data-action="Deal Block" data-label="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="Amazon: Get AU$300 Amazon store credit when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="18ae908e-84cf-11f1-8c50-335cd40e3a45" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" href="https://www.jbhifi.com.au/pages/samsung-galaxy-unpacked" 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="dUMxuvDTBa7Tnj2jRqi8ME" name="JB-Hi-Fi-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/dUMxuvDTBa7Tnj2jRqi8ME-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>JB Hi-Fi: </strong><a href="https://www.jbhifi.com.au/pages/samsung-galaxy-unpacked" target="_blank" data-dimension112="18ae908e-84cf-11f1-8c50-335cd40e3a45" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension25=""><strong>Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra</strong></a></p><p>JB Hi-Fi offers an easy-to-use retail perk by including a AU$150 JB Hi-Fi Gift Card with all Z Fold 8 and Z Fold 8 Ultra purchases. This makes JB Hi-Fi a decent option for outright buyers, though it's worth noting that the gift card was worth twice as much during the pre-order window. Still, it's better than nothing!<a class="view-deal button" href="https://www.jbhifi.com.au/pages/samsung-galaxy-unpacked" target="_blank" rel="nofollow" data-dimension112="18ae908e-84cf-11f1-8c50-335cd40e3a45" data-action="Deal Block" data-label="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension48="JB Hi-Fi: Get a AU$150 JB Hi-Fi gift card when you pre-order Galaxy Z Fold 8 or Z Fold 8 Ultra" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="18ae8fd0-84cf-11f1-9fce-2d74e41bf1cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-fold8" 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="YwvBBB6x3H2wXEEEevoNYC" name="Optus-logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YwvBBB6x3H2wXEEEevoNYC-1920-80.jpg" mos="" align="middle" fullscreen="" width="500" height="500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Optus: </strong><a href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-fold8" target="_blank" data-dimension112="18ae8fd0-84cf-11f1-9fce-2d74e41bf1cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension25=""><strong>Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months</strong></a></p><p>Optus offers a simplified, model-agnostic plan deal by slashing AU$600 off any model in the lineup (Z Fold 8 or Z Fold 8 Ultra) over the course of a 12-, 24- or 36-month repayment plan. That's slightly less than the $750 saving being offered during the pre-order period, but for a post-release offer, this is a great deal.<a class="view-deal button" href="https://www.optus.com.au/mobile/phones/samsung/galaxy-z-fold8" target="_blank" rel="nofollow" data-dimension112="18ae8fd0-84cf-11f1-9fce-2d74e41bf1cc" data-action="Deal Block" data-label="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension48="Optus: Get a AU$600 discount when you buy any Galaxy Z Fold 8 device and stay connected for 12, 24 or 36 months" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="18ae9034-84cf-11f1-9f13-dbfb2fea9ee9" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-fold8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:550px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="QfajE7yyJxPSmrv4c6Jwv7" name="vodafone logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/QfajE7yyJxPSmrv4c6Jwv7-1920-80.jpg" mos="" align="middle" fullscreen="" width="550" height="550" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Vodafone: </strong><a href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-fold8" target="_blank" data-dimension112="18ae9034-84cf-11f1-9f13-dbfb2fea9ee9" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension25=""><strong>Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan</strong></a></p><p>Vodafone knocks AU$500 off both the Z Fold 8 and Z Fold 8 Ultra on 24- or 36-month repayment contracts, which is a great post-release offer for those who missed out on the pre-order window.<a class="view-deal button" href="https://www.vodafone.com.au/mobile/mobile-phones/samsung/samsung-galaxy-z-fold8" target="_blank" rel="nofollow" data-dimension112="18ae9034-84cf-11f1-9f13-dbfb2fea9ee9" data-action="Deal Block" data-label="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension48="Vodafone: Save up to AU$500 when purchasing Galaxy Z Fold 8 on an eligible 24- or 36-month plan" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-z-fold-8-plans"><span>Galaxy Z Fold 8 plans</span></h3><iframe allow="" height="1170" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://tomsguide.whistleout.com.au/Widgets/MobilePhoneSearch/Load?calls=-1&customer=Personal&data=5000&phone=Samsung-Galaxy-Z-Fold8-5G-256GB&sms=-1&maxresults=10&includefeatured=false&hd=Samsung%20Galaxy%20Z%20Fold%208%20Plans%20(256GB)"></iframe><h3 class="article-body__section" id="section-galaxy-z-fold-8-ultra-plans"><span>Galaxy Z Fold 8 Ultra plans</span></h3><iframe allow="" height="1170" width="100%" id="" style="" class="position-center" data-lazy-priority="low" data-lazy-src="https://tomsguide.whistleout.com.au/Widgets/MobilePhoneSearch/Load?calls=-1&customer=Personal&data=5000&phone=Samsung-Galaxy-Z-Fold8-Ultra-5G-256GB&sms=-1&maxresults=10&includefeatured=false&hd=Samsung%20Galaxy%20Z%20Fold%208%20Ultra%20Plans%20(256GB)"></iframe><h2 id="galaxy-z-fold-8-vs-galaxy-z-fold-8-ultra-what-do-you-get">Galaxy Z Fold 8 vs Galaxy Z Fold 8 Ultra — what do you get?</h2><div ><table><thead><tr><th class="firstcol empty" ></th><th  ><p>Samsung Galaxy Z Fold 8</p></th><th  ><p>Samsung Galaxy Z Fold 8 Ultra</p></th></tr></thead><tbody><tr><td class="firstcol " ><p><strong>Price</strong></p></td><td  ><p>From AU$2,699</p></td><td  ><p>From AU$2,999</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong></p></td><td  ><p>7.6 inches AMOLED (1848 x 2448, 1-120Hz)</p></td><td  ><p>8 inches AMOLED (2504 x 2256, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong></p></td><td  ><p>5.5 inches AMOLED (1248 x 1972, 1-120Hz) </p></td><td  ><p>6.5 inches AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong></p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong></p></td><td  ><p>12GB / 16GB</p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong></p></td><td  ><p>256GB/512GB/1TB</p></td><td  ><p>256GB/512GB/1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear cameras</strong></p></td><td  ><p>50MP wide, 50MP Ultra wide (10x digital zoom)</p></td><td  ><p>200MP wide, 50MP ultra-wide, 10MP telephoto (3x optical)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover camera</strong></p></td><td  ><p>10MP</p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Main display camera</strong></p></td><td  ><p>10MP (f/2.2)</p></td><td  ><p>10MP</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong></p></td><td  ><p>45W wired / 20W wireless</p></td><td  ><p>45W wired / 20W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong></p></td><td  ><p>4,800 mAh</p></td><td  ><p>5,000 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong></p></td><td  ><p>123.9 x 81.9 x 9.7 mm (folded), 161.4 x 123.9 x 4.5 mm (unfolded)</p></td><td  ><p>158.4 x 72.8 x 8.9 mm (6.24 x 2.87 x 0.35 inches) folded, 143.2 x 158.4 x 4.2 mm (5.64 x 6.24 x 0.16 inches) unfolded</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong></p></td><td  ><p>201 grams </p></td><td  ><p>215 grams</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong></p></td><td  ><p>IP48</p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong> </p></td><td  ><p>Lavender, Graphite, Cream, Pistachio (online)</p></td><td  ><p>Violet shadow, Cream, Graphite, Violet Green (online exclusive)</p></td></tr></tbody></table></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
                                <item>
                                                            <title><![CDATA[ Best Galaxy Z Flip 8 deals: get Samsung's new foldable for free ]]></title>
                                                                                                <dc:content><![CDATA[ <p>With a starting price of $1,199, the new Galaxy Z Flip 8 is $100 pricier than its predecessor. That makes Galaxy Z Flip 8 preorder deals all the more important if you're looking to save money. </p><p>Unveiled at the recent Galaxy Unpacked event, the new phone will release on August 7. It was announced alongside its pricier siblings, the Galaxy Z Fold 8 ($1,899) and Galaxy Z Fold 8 Ultra ($2,099).</p><p>If you're looking to save money, the best Galaxy Z Flip 8 preorder deal right now comes from T-Mobile. For a limited time, you can get <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">up to $1,100 off Galaxy Z Flip 8 at T-Mobile</a> with trade-in and Experience More or Experience Beyond plans. Or you can get up to $500 off with trade-in on most other unlimited plans. </p><p>In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 review</a>, we called it Samsung's sleekest and most refined flip phone to date. But Z Flip 7 owners aren't missing much in terms of hardware updates. If you're eager to get Samsung's new foldable, there are many Galaxy Z Flip 8 deals you can get right now. Below I've rounded up my favorite. (For more ways to save, check out our guide to the best <a href="https://www.tomsguide.com/coupons/samsung.com">Samsung promo codes</a>).</p><p><strong>Note:</strong> Verizon has yet to release any Galaxy Z Flip 8 preorder deals. In the meantime, you can <a href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-verizon-sku-sm-f776uliavzw/" target="_blank" rel="nofollow">preorder the Galaxy Z Flip 8 for Verizon via Samsung</a> and get up to $900 in bill credits via trade-in and select data plans.  </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>T-Mobile: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>up to $1,100 off w/ trade-in + unlimited</strong></a></li><li><strong>Samsung: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow"><strong>up to $600 off w/ trade-in or $150 credit</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><strong>up to $1,200 off + $200 gift card</strong></a></li><li><strong>AT&T: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-flip8.html" target="_blank" rel="nofollow"><strong>$5/month w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Xfinity Mobile: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-flip8" target="_blank" rel="nofollow"><strong>up to $1,000 off w/ trade-in</strong></a><strong></strong></li><li><strong>Amazon: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12FP315" target="_blank" rel="nofollow"><strong>for $1,199 w/ $200 gift card</strong></a></li></ul><h3 class="article-body__section" id="section-galaxy-z-flip-8-deals"><span>Galaxy Z Flip 8 deals</span></h3><div class="product"><a data-dimension112="a382c82c-85f8-11f1-8d64-db4a44dbbade" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1312px;"><p class="vanilla-image-block" style="padding-top:55.95%;"><img id="YFnsbuxZypxrkdepxUH3h9" name="Samsung logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1312" height="734" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow" data-dimension112="a382c82c-85f8-11f1-8d64-db4a44dbbade" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $600 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $600 off its Galaxy Z Flip 8 preorder when you trade-in an older phone. Or you can get a $150 Samsung credit with no trade-in. The phone features a 6.9-inch AMOLED (1080 x 2520) inner display w/ 120Hz refresh, 4.1-inch AMOLED (948 x 1048) outer display w/ 120Hz refresh, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. You also get 50MP f/1.8 main and 12MP f/2.2 ultra-wide rear cameras and a 10MP f2.2 selfie cam. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 review</a>, we said it's Samsung's sleekest and most refined flip phone to date, but not a necessary upgrade for current Z Flip 7 owners. <a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow" data-dimension112="a382c82c-85f8-11f1-8d64-db4a44dbbade" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382c8a4-85f8-11f1-8d1f-a9faa1a967e6" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="a382c8a4-85f8-11f1-8d1f-a9faa1a967e6" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,100 off w/ trade-in + unlimited @ T-Mobile</strong></a><br>T-Mobile is offering various Galaxy Z Flip 8 deals. You can get the phone for $1,100 off with trade-in and when you add a line on T-Mobile's Experience More or Experience Beyond plans. Or get it for $500 off with trade-in on most other data plans. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="a382c8a4-85f8-11f1-8d1f-a9faa1a967e6" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382c91c-85f8-11f1-a48d-efc60c6b7860" data-action="Deal Block" data-label="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" href="https://www.att.com/buy/phones/samsung-galaxy-z-flip8.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:225px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="o9PdShQsgAk95AN7C5UMNR" name="AT&T Logo.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o9PdShQsgAk95AN7C5UMNR-1920-80.jpeg" mos="" align="middle" fullscreen="" width="225" height="225" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-flip8.html" target="_blank" rel="nofollow" data-dimension112="a382c91c-85f8-11f1-a48d-efc60c6b7860" data-action="Deal Block" data-label="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension25=""><strong>$5/month w/ trade-in + unlimited @ AT&T</strong></a><br>New and existing customers can get a Galaxy Z Flip 8 for $5.56/month when you trade-in a phone and open an eligible unlimited data plan. <a class="view-deal button" href="https://www.att.com/buy/phones/samsung-galaxy-z-flip8.html" target="_blank" rel="nofollow" data-dimension112="a382c91c-85f8-11f1-a48d-efc60c6b7860" data-action="Deal Block" data-label="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382c994-85f8-11f1-8a4f-43e06bd270af" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1331px;"><p class="vanilla-image-block" style="padding-top:68.52%;"><img id="yjsgCbZzcWDLMuhHtLHa7K" name="Best Buy deal block 2022.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yjsgCbZzcWDLMuhHtLHa7K-1920-80.jpeg" mos="" align="middle" fullscreen="" width="1331" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="a382c994-85f8-11f1-8a4f-43e06bd270af" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension25=""><strong>up to $1,200 off w/ trade-in + $200 gift card @ Best Buy</strong></a><br>Best Buy is offering one of the best Galaxy Z Flip 8 deals right now. Purchase your phone at Best Buy and you'll get up to $1,200 off via trade-in and a free $200 Best Buy gift card. <a class="view-deal button" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="a382c994-85f8-11f1-8a4f-43e06bd270af" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382ca0c-85f8-11f1-b6ee-278370d2209b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" href="https://www.verizon.com/smartphones/samsung/?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3321px;"><p class="vanilla-image-block" style="padding-top:40.98%;"><img id="R4vXmWQKAkSdQs7bVstjs8" name="Verizon logo 2024.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R4vXmWQKAkSdQs7bVstjs8-1920-80.jpg" mos="" align="middle" fullscreen="" width="3321" height="1361" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.verizon.com/smartphones/samsung/?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="a382ca0c-85f8-11f1-b6ee-278370d2209b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension25=""><strong>up to $1,100 off w/ trade-in @ Verizon</strong></a><br>Verizon is offering aggressive Galaxy Z Flip 8 deals. Trade-in an old phone and you'll get up to $1,100 off Samsung's new foldable. <a class="view-deal button" href="https://www.verizon.com/smartphones/samsung/?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="a382ca0c-85f8-11f1-b6ee-278370d2209b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382ca84-85f8-11f1-bb49-9b4d92238e08" data-action="Deal Block" data-label="Z Flip 8" data-dimension48="Z Flip 8" data-dimension25="$1199" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12FP315" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1199px;"><p class="vanilla-image-block" style="padding-top:125.10%;"><img id="rTkAPNzBbP77RUVHtMufoZ" name="Galaxy Z Flip 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rTkAPNzBbP77RUVHtMufoZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1199" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Amazon is offering a free $200 Amazon gift card when you buy your Galaxy Z Flip 8. You'll pay full price for the unlocked phone, but get a generous gift card in return.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12FP315" target="_blank" rel="nofollow" data-dimension112="a382ca84-85f8-11f1-bb49-9b4d92238e08" data-action="Deal Block" data-label="Z Flip 8" data-dimension48="Z Flip 8" data-dimension25="$1199">View Deal</a></p></div><div class="product"><a data-dimension112="a382caf2-85f8-11f1-82b8-9d3b5d4064e8" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-flip8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="ukXfYk4wgducEMDS2iCCjY" name="Xfinity Mobile Logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ukXfYk4wgducEMDS2iCCjY-1920-80.jpg" mos="" align="middle" fullscreen="" width="960" height="539" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="a382caf2-85f8-11f1-82b8-9d3b5d4064e8" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension25=""><strong>up to $1,00 off w/ trade-in @ Xfinity Mobile</strong></a><br>Purchase the Galaxy Z Flip 8 at Xfinity Mobile and you'll save up to $1,000 after trade-in. If you don't have a phone to trade-in, you can still get up to $600 off Samsung's new phone. <a class="view-deal button" href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="a382caf2-85f8-11f1-82b8-9d3b5d4064e8" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382cb6a-85f8-11f1-82d5-eb4ed3c9c3b1" data-action="Deal Block" data-label="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension48="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" href="https://www.boostmobile.com/plans/infinite-access-for-galaxy" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:713px;"><p class="vanilla-image-block" style="padding-top:38.85%;"><img id="UGYgmHB5HuHtAFmJHSMZnU" name="Boost Mobile logo 2024.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/UGYgmHB5HuHtAFmJHSMZnU-1920-80.jpg" mos="" align="middle" fullscreen="" width="713" height="277" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 7: </strong><a href="https://www.boostmobile.com/plans/infinite-access-for-galaxy" target="_blank" rel="nofollow" data-dimension112="a382cb6a-85f8-11f1-82d5-eb4ed3c9c3b1" data-action="Deal Block" data-label="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension48="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension25=""><strong>free w/ unlimited @ Boost Mobile</strong></a><br>Boost Mobile is offering the Galaxy Flip 7 for free. Best of all, no trade-in is required. You'll just need to sign up to an unlimited data plan from $65/month.<a class="view-deal button" href="https://www.boostmobile.com/plans/infinite-access-for-galaxy" target="_blank" rel="nofollow" data-dimension112="a382cb6a-85f8-11f1-82d5-eb4ed3c9c3b1" data-action="Deal Block" data-label="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension48="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-z-flip-8-specs"><span>Galaxy Z Flip 8 specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>$1,199 / £1,149 </p></td></tr><tr><td class="firstcol " ><p><strong>Release date</strong></p></td><td  ><p>August 7</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong>    </p></td><td  ><p>6.9-inch AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong>    </p></td><td  ><p>4.1-inch AMOLED (948 x 1048, 60Hz / 120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong>    </p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Camera</strong>    </p></td><td  ><p>10MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>25W wired / 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>4,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>6.57 x 2.97 x 0.24 inches unfolded (166.9 x 75.4 x 6.1 mm), 3.37 x 2.97 x 0.52 inches folded (85.7 x 75.4 x 13.1mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>6.35 ounces (180 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong>    </p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Pink, Graphite, Cream, Mint (online)</p></td></tr></tbody></table></div><p>In our initial hands-on, we aren't as infatuated with the Galaxy Z Flip 8 as we were with its predecessor. For one, it now comes with a $100 price increase which places it closer to flagships like the $1,199 iPhone 17 Pro Max and the $1,299 Galaxy S26 Ultra, which offers a more robust camera system, a larger battery, and more productivity features. Additionally, the Galaxy Z Flip 8 feels more like a simple, iterative upgrade than it does a groundbreaking phone. </p><p>That said, there are many things Samsung got right with this phone. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 review</a>, we called it Samsung's sleekest and most refined flip phone to date. We also feel its a great phone for vlogging than either the Z Fold 8 or Z Fold 8 Ultra. That’s primarily due to its form factor, which is far better suited for capturing video using the rear cameras alongside the FlexWindow display. </p><p>Stay tuned to Tom's Guide as we spend more time with the phone and give you our final verdict. Alternatively, if you're interested in Samsung's Fold line, make sure to check out our guide to the best <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Galaxy Z Fold 8 preorder deals</a>.</p><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div> ]]></dc:content>
                                                                                                                                            <link>https://www.tomsguide.com/phones/samsung-phones/best-galaxy-z-flip-8-deals-get-samsungs-new-foldable-for-free</link>
                                                                            <description>
                            <![CDATA[ The first round of Galaxy Z Flip 8 preorder deals are live. From AT&T to Samsung, here are all the best deals I'd buy at carriers and retailers. ]]>
                                                                                                            </description>
                                                                                                                                <guid isPermaLink="false">K3AQ3stDNey4NiS8bxtM7X</guid>
                                                                                                <enclosure url="https://cdn.mos.cms.futurecdn.net/UsDbKYaT4XPPXsE8AmtpCJ-1920-80.jpg" type="image/jpeg" length="0"></enclosure>
                                                                        <pubDate>Wed, 22 Jul 2026 18:24:25 +0000</pubDate>                                                                                                                                <updated>Fri, 24 Jul 2026 14:04:05 +0000</updated>
                                                                                                                                            <category><![CDATA[Samsung Phones]]></category>
                                                    <category><![CDATA[Phones]]></category>
                                                    <category><![CDATA[Android Phones]]></category>
                                                                                                <author><![CDATA[ louis.ramirez@futurenet.com (Louis Ramirez) ]]></author>                    <dc:creator><![CDATA[ Louis Ramirez ]]></dc:creator>                                                                                    <dc:source><![CDATA[ https://cdn.mos.cms.futurecdn.net/oYF2xVwCb4pTGhAJi8Yqr5-320-70.jpeg ]]></dc:source>
                                                                <dc:description><![CDATA[ &lt;p&gt;As deals editor-in-chief at Tom’s Guide, Louis refuses to pay full price for anything. He has over 10 years of experience finding the best deals and coupons to bring readers. Louis price checks&amp;nbsp;against multiple retailers and searches high and low for sales on 4K TVs, Apple devices, streaming services, mattresses, kitchen appliances, and more.&amp;nbsp;He&#039;s also always looking for the the best coupon codes to turn good deals into stellar buys.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;He has covered major retail events like Amazon Prime Day, Black Friday, and Cyber Monday for more than a decade and knows how to spot an epic deal from a fake discount. He&#039;s also great at helping people negotiate better prices on everything from gym memberships to their home internet service. Louis&#039; work has also helped readers find PS5 restock, baby formula, Clorox wipes, and everything in between. For his next major purchase, Louis is hoping to find a killer deal on an M3-based Mac.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;A born-and-bred New Yorker, Louis is always in search of the perfect cup of coffee. On his free time, he enjoys swimming, running, and any workout that pushes his Apple Watch to the max. He&#039;s also a big fan of international films, horror movies, and K-dramas. His work has appeared on Gizmodo, CNET, Digital Trends, Dealnews, and Time Out New York.&lt;/p&gt; ]]></dc:description>
                                                                                                                                <cf:isSponsored>false</cf:isSponsored>
                <cf:hasAffiliateLinks>false</cf:hasAffiliateLinks>
                <cf:isPaid>false</cf:isPaid>
                                                                                                                                <media:content type="image/jpeg" url="https://cdn.mos.cms.futurecdn.net/UsDbKYaT4XPPXsE8AmtpCJ-1920-80.jpg">
                                                            <media:credit><![CDATA[Tom&#039;s Guide / John Velasco]]></media:credit>
                                                                                                                                                                                                                                    <media:description><![CDATA[Galaxy Z Flip 8 held in hand]]></media:description>                                                            <media:text><![CDATA[Galaxy Z Flip 8 held in hand]]></media:text>
                                <media:title type="plain"><![CDATA[Galaxy Z Flip 8 held in hand]]></media:title>
                                                    </media:content>
                                                    <media:thumbnail url="https://cdn.mos.cms.futurecdn.net/UsDbKYaT4XPPXsE8AmtpCJ-1920-80.jpg" />
                                                                                                                                                                    <content:encoded >
                            <![CDATA[
                            <article>
                                <p>With a starting price of $1,199, the new Galaxy Z Flip 8 is $100 pricier than its predecessor. That makes Galaxy Z Flip 8 preorder deals all the more important if you're looking to save money. </p><p>Unveiled at the recent Galaxy Unpacked event, the new phone will release on August 7. It was announced alongside its pricier siblings, the Galaxy Z Fold 8 ($1,899) and Galaxy Z Fold 8 Ultra ($2,099).</p><p>If you're looking to save money, the best Galaxy Z Flip 8 preorder deal right now comes from T-Mobile. For a limited time, you can get <a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow">up to $1,100 off Galaxy Z Flip 8 at T-Mobile</a> with trade-in and Experience More or Experience Beyond plans. Or you can get up to $500 off with trade-in on most other unlimited plans. </p><p>In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 review</a>, we called it Samsung's sleekest and most refined flip phone to date. But Z Flip 7 owners aren't missing much in terms of hardware updates. If you're eager to get Samsung's new foldable, there are many Galaxy Z Flip 8 deals you can get right now. Below I've rounded up my favorite. (For more ways to save, check out our guide to the best <a href="https://www.tomsguide.com/coupons/samsung.com">Samsung promo codes</a>).</p><p><strong>Note:</strong> Verizon has yet to release any Galaxy Z Flip 8 preorder deals. In the meantime, you can <a href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-verizon-sku-sm-f776uliavzw/" target="_blank" rel="nofollow">preorder the Galaxy Z Flip 8 for Verizon via Samsung</a> and get up to $900 in bill credits via trade-in and select data plans.  </p><h3 class="article-body__section" id="section-quick-links"><span>Quick Links</span></h3><ul><li><strong>T-Mobile: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><strong>up to $1,100 off w/ trade-in + unlimited</strong></a></li><li><strong>Samsung: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow"><strong>up to $600 off w/ trade-in or $150 credit</strong></a></li><li><strong>Best Buy: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><strong>up to $1,200 off + $200 gift card</strong></a></li><li><strong>AT&T: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-flip8.html" target="_blank" rel="nofollow"><strong>$5/month w/ trade-in + unlimited</strong></a><strong></strong></li><li><strong>Xfinity Mobile: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-flip8" target="_blank" rel="nofollow"><strong>up to $1,000 off w/ trade-in</strong></a><strong></strong></li><li><strong>Amazon: </strong><a href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12FP315" target="_blank" rel="nofollow"><strong>for $1,199 w/ $200 gift card</strong></a></li></ul><h3 class="article-body__section" id="section-galaxy-z-flip-8-deals"><span>Galaxy Z Flip 8 deals</span></h3><div class="product"><a data-dimension112="a382c82c-85f8-11f1-8d64-db4a44dbbade" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1312px;"><p class="vanilla-image-block" style="padding-top:55.95%;"><img id="YFnsbuxZypxrkdepxUH3h9" name="Samsung logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/YFnsbuxZypxrkdepxUH3h9-1920-80.jpg" mos="" align="middle" fullscreen="" width="1312" height="734" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow" data-dimension112="a382c82c-85f8-11f1-8d64-db4a44dbbade" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25=""><strong>up to $600 off w/ trade-in @ Samsung</strong></a><br>Samsung is knocking up to $600 off its Galaxy Z Flip 8 preorder when you trade-in an older phone. Or you can get a $150 Samsung credit with no trade-in. The phone features a 6.9-inch AMOLED (1080 x 2520) inner display w/ 120Hz refresh, 4.1-inch AMOLED (948 x 1048) outer display w/ 120Hz refresh, Snapdragon 8 Elite Gen 5 for Galaxy chipset, 12GB of RAM, and 256GB of storage. You also get 50MP f/1.8 main and 12MP f/2.2 ultra-wide rear cameras and a 10MP f2.2 selfie cam. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 review</a>, we said it's Samsung's sleekest and most refined flip phone to date, but not a necessary upgrade for current Z Flip 7 owners. <a class="view-deal button" href="https://www.samsung.com/us/smartphones/galaxy-z-flip8/buy/galaxy-z-flip8-256gb-unlocked-sku-sm-f776uliaxaa/" target="_blank" rel="nofollow" data-dimension112="a382c82c-85f8-11f1-8d64-db4a44dbbade" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension48="Galaxy Z Flip 8: up to $600 off w/ trade-in @ Samsung" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382c8a4-85f8-11f1-8d1f-a9faa1a967e6" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:600px;"><p class="vanilla-image-block" style="padding-top:66.67%;"><img id="4gDqoyT3A5J9nTa6Axevfg" name="TMobileLogo_1.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/4gDqoyT3A5J9nTa6Axevfg-1920-80.jpg" mos="" align="middle" fullscreen="" width="600" height="400" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="a382c8a4-85f8-11f1-8d1f-a9faa1a967e6" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension25=""><strong>up to $1,100 off w/ trade-in + unlimited @ T-Mobile</strong></a><br>T-Mobile is offering various Galaxy Z Flip 8 deals. You can get the phone for $1,100 off with trade-in and when you add a line on T-Mobile's Experience More or Experience Beyond plans. Or get it for $500 off with trade-in on most other data plans. <a class="view-deal button" href="https://tmobilepostpaid.pxf.io/c/1943169/3981416/38171?subId1=hawk-custom-tracking" target="_blank" rel="nofollow" data-dimension112="a382c8a4-85f8-11f1-8d1f-a9faa1a967e6" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in + unlimited @ T-Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382c91c-85f8-11f1-a48d-efc60c6b7860" data-action="Deal Block" data-label="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" href="https://www.att.com/buy/phones/samsung-galaxy-z-flip8.html" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:225px;"><p class="vanilla-image-block" style="padding-top:100.00%;"><img id="o9PdShQsgAk95AN7C5UMNR" name="AT&T Logo.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/o9PdShQsgAk95AN7C5UMNR-1920-80.jpeg" mos="" align="middle" fullscreen="" width="225" height="225" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.att.com/buy/phones/samsung-galaxy-z-flip8.html" target="_blank" rel="nofollow" data-dimension112="a382c91c-85f8-11f1-a48d-efc60c6b7860" data-action="Deal Block" data-label="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension25=""><strong>$5/month w/ trade-in + unlimited @ AT&T</strong></a><br>New and existing customers can get a Galaxy Z Flip 8 for $5.56/month when you trade-in a phone and open an eligible unlimited data plan. <a class="view-deal button" href="https://www.att.com/buy/phones/samsung-galaxy-z-flip8.html" target="_blank" rel="nofollow" data-dimension112="a382c91c-85f8-11f1-a48d-efc60c6b7860" data-action="Deal Block" data-label="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension48="Galaxy Z Flip 8: $5/month w/ trade-in + unlimited @ AT&amp;T" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382c994-85f8-11f1-8a4f-43e06bd270af" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1331px;"><p class="vanilla-image-block" style="padding-top:68.52%;"><img id="yjsgCbZzcWDLMuhHtLHa7K" name="Best Buy deal block 2022.jpeg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/yjsgCbZzcWDLMuhHtLHa7K-1920-80.jpeg" mos="" align="middle" fullscreen="" width="1331" height="912" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="a382c994-85f8-11f1-8a4f-43e06bd270af" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension25=""><strong>up to $1,200 off w/ trade-in + $200 gift card @ Best Buy</strong></a><br>Best Buy is offering one of the best Galaxy Z Flip 8 deals right now. Purchase your phone at Best Buy and you'll get up to $1,200 off via trade-in and a free $200 Best Buy gift card. <a class="view-deal button" href="https://www.bestbuy.com/productlist/promo/latest-samsung-galaxy-phones" target="_blank" rel="nofollow" data-dimension112="a382c994-85f8-11f1-8a4f-43e06bd270af" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension48="Galaxy Z Flip 8: up to $1,200 off w/ trade-in + $200 gift card @ Best Buy" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382ca0c-85f8-11f1-b6ee-278370d2209b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" href="https://www.verizon.com/smartphones/samsung/?isMyPlanFlow=true" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:3321px;"><p class="vanilla-image-block" style="padding-top:40.98%;"><img id="R4vXmWQKAkSdQs7bVstjs8" name="Verizon logo 2024.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/R4vXmWQKAkSdQs7bVstjs8-1920-80.jpg" mos="" align="middle" fullscreen="" width="3321" height="1361" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.verizon.com/smartphones/samsung/?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="a382ca0c-85f8-11f1-b6ee-278370d2209b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension25=""><strong>up to $1,100 off w/ trade-in @ Verizon</strong></a><br>Verizon is offering aggressive Galaxy Z Flip 8 deals. Trade-in an old phone and you'll get up to $1,100 off Samsung's new foldable. <a class="view-deal button" href="https://www.verizon.com/smartphones/samsung/?isMyPlanFlow=true" target="_blank" rel="nofollow" data-dimension112="a382ca0c-85f8-11f1-b6ee-278370d2209b" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension48="Galaxy Z Flip 8: up to $1,100 off w/ trade-in @ Verizon" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382ca84-85f8-11f1-bb49-9b4d92238e08" data-action="Deal Block" data-label="Z Flip 8" data-dimension48="Z Flip 8" data-dimension25="$1199" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12FP315" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:1199px;"><p class="vanilla-image-block" style="padding-top:125.10%;"><img id="rTkAPNzBbP77RUVHtMufoZ" name="Galaxy Z Flip 8 deal block" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/rTkAPNzBbP77RUVHtMufoZ-1920-80.jpg" mos="" align="middle" fullscreen="" width="1199" height="1500" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p>Amazon is offering a free $200 Amazon gift card when you buy your Galaxy Z Flip 8. You'll pay full price for the unlocked phone, but get a generous gift card in return.<a class="view-deal button" href="https://www.amazon.com/Samsung-Galaxy-Fold8-Violet-Shadow/dp/B0H12FP315" target="_blank" rel="nofollow" data-dimension112="a382ca84-85f8-11f1-bb49-9b4d92238e08" data-action="Deal Block" data-label="Z Flip 8" data-dimension48="Z Flip 8" data-dimension25="$1199">View Deal</a></p></div><div class="product"><a data-dimension112="a382caf2-85f8-11f1-82b8-9d3b5d4064e8" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-flip8" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:960px;"><p class="vanilla-image-block" style="padding-top:56.15%;"><img id="ukXfYk4wgducEMDS2iCCjY" name="Xfinity Mobile Logo.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/ukXfYk4wgducEMDS2iCCjY-1920-80.jpg" mos="" align="middle" fullscreen="" width="960" height="539" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 8: </strong><a href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="a382caf2-85f8-11f1-82b8-9d3b5d4064e8" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension25=""><strong>up to $1,00 off w/ trade-in @ Xfinity Mobile</strong></a><br>Purchase the Galaxy Z Flip 8 at Xfinity Mobile and you'll save up to $1,000 after trade-in. If you don't have a phone to trade-in, you can still get up to $600 off Samsung's new phone. <a class="view-deal button" href="https://www.xfinity.com/mobile/shop/phone/galaxy-z-flip8" target="_blank" rel="nofollow" data-dimension112="a382caf2-85f8-11f1-82b8-9d3b5d4064e8" data-action="Deal Block" data-label="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension48="Galaxy Z Flip 8: up to $1,00 off w/ trade-in @ Xfinity Mobile" data-dimension25="">View Deal</a></p></div><div class="product"><a data-dimension112="a382cb6a-85f8-11f1-82d5-eb4ed3c9c3b1" data-action="Deal Block" data-label="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension48="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" href="https://www.boostmobile.com/plans/infinite-access-for-galaxy" target="_blank" rel="nofollow"><figure class="van-image-figure "  ><div class='image-full-width-wrapper'><div class='image-widthsetter' style="max-width:713px;"><p class="vanilla-image-block" style="padding-top:38.85%;"><img id="UGYgmHB5HuHtAFmJHSMZnU" name="Boost Mobile logo 2024.jpg" caption="" alt="" src="https://cdn.mos.cms.futurecdn.net/UGYgmHB5HuHtAFmJHSMZnU-1920-80.jpg" mos="" align="middle" fullscreen="" width="713" height="277" attribution="" endorsement="" credit="" class=""></p></div></div></figure></a><p><strong>Galaxy Z Flip 7: </strong><a href="https://www.boostmobile.com/plans/infinite-access-for-galaxy" target="_blank" rel="nofollow" data-dimension112="a382cb6a-85f8-11f1-82d5-eb4ed3c9c3b1" data-action="Deal Block" data-label="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension48="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension25=""><strong>free w/ unlimited @ Boost Mobile</strong></a><br>Boost Mobile is offering the Galaxy Flip 7 for free. Best of all, no trade-in is required. You'll just need to sign up to an unlimited data plan from $65/month.<a class="view-deal button" href="https://www.boostmobile.com/plans/infinite-access-for-galaxy" target="_blank" rel="nofollow" data-dimension112="a382cb6a-85f8-11f1-82d5-eb4ed3c9c3b1" data-action="Deal Block" data-label="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension48="Galaxy Z Flip 7: free w/ unlimited @ Boost Mobile" data-dimension25="">View Deal</a></p></div><h3 class="article-body__section" id="section-galaxy-z-flip-8-specs"><span>Galaxy Z Flip 8 specs</span></h3><div ><table><tbody><tr><td class="firstcol " ><p><strong>Price</strong>    </p></td><td  ><p>$1,199 / £1,149 </p></td></tr><tr><td class="firstcol " ><p><strong>Release date</strong></p></td><td  ><p>August 7</p></td></tr><tr><td class="firstcol " ><p><strong>Main display</strong>    </p></td><td  ><p>6.9-inch AMOLED (1080 x 2520, 1-120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Cover display</strong>    </p></td><td  ><p>4.1-inch AMOLED (948 x 1048, 60Hz / 120Hz)</p></td></tr><tr><td class="firstcol " ><p><strong>Chipset</strong>    </p></td><td  ><p>Snapdragon 8 Elite Gen 5 for Galaxy</p></td></tr><tr><td class="firstcol " ><p><strong>RAM</strong>    </p></td><td  ><p>12GB / 16GB</p></td></tr><tr><td class="firstcol " ><p><strong>Storage</strong>    </p></td><td  ><p>256GB / 512GB / 1TB</p></td></tr><tr><td class="firstcol " ><p><strong>Rear Cameras</strong>    </p></td><td  ><p>50MP main (f/1.8), 12MP ultrawide (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Selfie Camera</strong>    </p></td><td  ><p>10MP (f/2.2)</p></td></tr><tr><td class="firstcol " ><p><strong>Charging</strong>    </p></td><td  ><p>25W wired / 15W wireless</p></td></tr><tr><td class="firstcol " ><p><strong>Battery</strong>    </p></td><td  ><p>4,300 mAh</p></td></tr><tr><td class="firstcol " ><p><strong>Dimensions</strong>    </p></td><td  ><p>6.57 x 2.97 x 0.24 inches unfolded (166.9 x 75.4 x 6.1 mm), 3.37 x 2.97 x 0.52 inches folded (85.7 x 75.4 x 13.1mm)</p></td></tr><tr><td class="firstcol " ><p><strong>Weight</strong>    </p></td><td  ><p>6.35 ounces (180 grams)</p></td></tr><tr><td class="firstcol " ><p><strong>IP Rating</strong>    </p></td><td  ><p>IP48</p></td></tr><tr><td class="firstcol " ><p><strong>Colors</strong>    </p></td><td  ><p>Pink, Graphite, Cream, Mint (online)</p></td></tr></tbody></table></div><p>In our initial hands-on, we aren't as infatuated with the Galaxy Z Flip 8 as we were with its predecessor. For one, it now comes with a $100 price increase which places it closer to flagships like the $1,199 iPhone 17 Pro Max and the $1,299 Galaxy S26 Ultra, which offers a more robust camera system, a larger battery, and more productivity features. Additionally, the Galaxy Z Flip 8 feels more like a simple, iterative upgrade than it does a groundbreaking phone. </p><p>That said, there are many things Samsung got right with this phone. In our <a href="https://www.tomsguide.com/phones/samsung-phones/samsung-galaxy-z-flip-8-hands-on-review">Galaxy Z Flip 8 review</a>, we called it Samsung's sleekest and most refined flip phone to date. We also feel its a great phone for vlogging than either the Z Fold 8 or Z Fold 8 Ultra. That’s primarily due to its form factor, which is far better suited for capturing video using the rear cameras alongside the FlexWindow display. </p><p>Stay tuned to Tom's Guide as we spend more time with the phone and give you our final verdict. Alternatively, if you're interested in Samsung's Fold line, make sure to check out our guide to the best <a href="https://www.tomsguide.com/phones/samsung-phones/galaxy-z-fold-8-preorder-deals-heres-how-im-saving-up-to-usd1-200-on-samsungs-new-phones">Galaxy Z Fold 8 preorder deals</a>.</p><h3 class="article-body__section" id="section-shop-more-deals"><span>Shop more deals</span></h3><div class="vizualizer-embed"><div class="tg-df-widget-host" data-widget-config="?search=Everything&rows=6&view_mode=savings_squad&widget_title=Top+Deals+Handpicked+by+Our+Editors&widget_subtitle=Discover+the+best+discounts+currently+available%2C+curated+daily+by+the+Tom%27s+Guide+Savings+Squad.&bg_color=transparent" data-vizualizer-embed="true"></div>    <script>    /**     * Tom's Guide Deals Finder - Vanilla JS Encapsulated Engine     */    (function() {      // --- Freyr Analytics Adapter ---      function initAnalytics() {        window.dataLayer = window.dataLayer || [];        window.googletag = window.googletag || {};        window.googletag.cmd = window.googletag.cmd || [];        window.hawk = window.hawk || { analytics: { freyr: [] } };        window.hawk.analytics = window.hawk.analytics || { freyr: [] };        window.hawk.analytics.freyr = window.hawk.analytics.freyr || [];        window.freyr = window.freyr || { cmd: [] };        const scriptSrc = 'https://freyr.futurecdn.net/freyr.js';        const hostname = typeof window !== 'undefined' ? window.location.hostname : '';        const isTestEnv = typeof window.navigator !== 'undefined' && (window.navigator.webdriver || window.navigator.userAgent.includes('Headless'));        const shouldSendRealAnalytics = !isTestEnv && hostname && hostname !== 'localhost' && hostname !== '127.0.0.1' && !hostname.includes('run.app');        if (shouldSendRealAnalytics && !document.querySelector(`script[src="${scriptSrc}"]`)) {          const script = document.createElement('script');          script.src = scriptSrc;          script.async = true;          document.head.appendChild(script);        }      }      function storeEventForDebug(name, data) {        if (!window.hawk || !window.hawk.analytics || !window.hawk.analytics.freyr) return;        window.hawk.analytics.freyr.push({ name, data });        try {          if (typeof window !== 'undefined' && window.localStorage) {            window.localStorage.setItem("hawk", JSON.stringify(window.hawk));          }        } catch (e) {          // Ignore storage issues        }        try {          window.dispatchEvent(new CustomEvent("hawk-analytics-update"));        } catch (e) {}      }      function sendToFreyr(eventName, data) {        if (typeof window === 'undefined') return;        window.freyr = window.freyr || { cmd: [] };        window.freyr.cmd.push(() => {          if (window.freyr && window.freyr.pushAndUpdate) {            window.freyr.pushAndUpdate(eventName, data);          }        });      }      function sendEvent(event, skip = false) {        try {          storeEventForDebug(event.name, event.data);          if (!skip) {            sendToFreyr(event.name, event.data);          }        } catch (e) {          // Ensure tracking errors don't surface to the user        }      }      function getCookie(name) {        try {          const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));          return match ? match[2] : null;        } catch (e) {          return null;        }      }      function getTimeAgo(dateString) {        if (!dateString) return '';        const date = new Date(dateString);        const now = new Date();        const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);        if (diffInSeconds < 60) return 'Just now';        const diffInMinutes = Math.floor(diffInSeconds / 60);        if (diffInMinutes < 60) return `${diffInMinutes} min${diffInMinutes > 1 ? 's' : ''} ago`;        const diffInHours = Math.floor(diffInMinutes / 60);        if (diffInHours < 24) return `${diffInHours} hr${diffInHours > 1 ? 's' : ''} ago`;        const diffInDays = Math.floor(diffInHours / 24);        if (diffInDays < 30) return `${diffInDays} day${diffInDays > 1 ? 's' : ''} ago`;        const diffInMonths = Math.floor(diffInDays / 30);        if (diffInMonths < 12) return `${diffInMonths} mo${diffInMonths > 1 ? 's' : ''} ago`;        const diffInYears = Math.floor(diffInDays / 365);        return `${diffInYears} yr${diffInYears > 1 ? 's' : ''} ago`;      }      function normalizeCurrency(symbol) {        const map = {          '£': 'GBP',          '$': 'USD',          'A$': 'AUD',          'CA$': 'CAD',          '€': 'EUR'        };        return map[symbol] || symbol;      }      function trackElementInteraction(props) {        sendEvent({          name: 'elementInteraction',          data: {            element: {              action: props.action || "click",              id: props.id || undefined,              class: props.class || undefined,              name: props.name || undefined,              text: props.text || undefined,              label: props.label || undefined,              container: props.container || undefined,              url: props.url || undefined,              articleId: props.articleId || undefined            }          }        });      }      function generateRevenueId(url, productName, merchantName, modelId) {        const str = `${window.location.href}|${productName}|${merchantName}|${modelId || ''}|${new Date().toDateString()}|tomsguide`;        let hash = 0;        for (let i = 0; i < str.length; i++) {          const char = str.charCodeAt(i);          hash = ((hash << 5) - hash) + char;          hash = hash & hash;        }        let numericStr = Math.abs(hash).toString();        while (numericStr.length < 19) {          numericStr += Math.floor(Math.random() * 10).toString();        }        return numericStr.substring(0, 19);      }      function rewriteAffiliateLink(url, territory, revenueId) {        if (!url) return url;        const t = (territory || 'gb').toLowerCase();        return url.replace(/hawk-custom-tracking/g, `tomsguide-${t}-${revenueId}`);      }      function trackHawkEvent(params) {        const { clickType, widgetId, productCategoryName, product, productsArray, zeroBasedProductIndexOrNull, totalDealsOrProducts, areaClicked, merchant, revenueId, isoCurrencyCode, queryName, widgetTypeName } = params;        const data = {          event: "hawkEvent",          category: "Affiliates",          affiliate: {            action: {              type: clickType,              id: widgetId,              event: clickType === "appeared" ? "viewed" : "Click from",              timestamp: Date.now()            },            component: {              flag: "Editor",              product: productCategoryName || "deals",              category: `Signal Deal Finder ${widgetTypeName || "Carousel"} widget`,              type: clickType === "appeared" ? "review" : "signal product",              label: queryName || (product ? (product.name || "") : ""),              index: zeroBasedProductIndexOrNull === null || zeroBasedProductIndexOrNull === undefined ? -1 : zeroBasedProductIndexOrNull,              linkCount: totalDealsOrProducts || 0,              blockLayout: "",              areaClicked: areaClicked || ""            }          },          products: productsArray || (product && merchant ? [            {              product: {                primary: {                  id: product.id || product.matchId || null,                  name: product.name,                  type: "deal",                  price: product.price,                  previousPrice: product.previousPrice || null,                  currency: isoCurrencyCode || "USD",                  preorder: false,                  labels: [],                  link: product.link,                  originalLink: product.originalLink || null,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: null,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: product.globalId || null,                  inStock: product.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: isoCurrencyCode || "USD"                }              },              merchant: {                id: merchant.id || null,                name: merchant.name,                url: merchant.url || null,                network: merchant.network || null              },              model: {                id: product.modelId || null,                brand: product.brand || null,                name: product.name,                parent: product.parent || null              }            }          ] : []),          reviews: [],          _clear: true,          "gtm.uniqueEventId": Date.now() % 10000        };        sendEvent({ name: 'hawkEvent', data });      }      function trackDealClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card" });      }      function trackViewSimilarClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Product Card View Similar" });      }      function trackPriceComparisonClick(params) {        trackHawkEvent({ ...params, clickType: "retailer", areaClicked: "Signal Price Comparison" });      }      function trackReviewClick(params) {        trackHawkEvent({ ...params, clickType: "review", areaClicked: "Signal Product Card Review Link" });      }      function trackShare(params) {        trackHawkEvent({ ...params, clickType: "share", areaClicked: "Signal Product Card Share" });      }      function trackDealsAppeared(widgetId, deals, revenueId, currency, queryName, widgetTypeName) {         if (!deals || deals.length === 0) return;                  const productsArray = deals.slice(0, 50).map((deal) => {            let voucherPct = null;            let rawPrice = parseFloat(deal.rawPrice) || parseFloat(deal.price) || null;            let rawMsrp = parseFloat(deal.rawMsrp) || parseFloat(deal.msrp) || null;            if (rawMsrp > rawPrice && rawPrice > 0) {              voucherPct = Math.round((1 - (rawPrice / rawMsrp)) * 100);            }            let numId = null;            if (deal.externalProductId && !isNaN(parseInt(deal.externalProductId))) {              numId = parseInt(deal.externalProductId);            } else if (deal.id && !isNaN(parseInt(deal.id))) {              numId = parseInt(deal.id);            } else {              numId = deal.matchId || null;            }            return {              product: {                primary: {                  id: numId,                  name: deal.productName || deal.title || "",                  type: "deal",                  price: rawPrice,                  previousPrice: rawMsrp,                  currency: currency || 'USD',                  preorder: false,                  labels: deal.modelBrand || deal.brand ? [                     { type: "brand", value: deal.modelBrand || deal.brand }                  ] : [],                  link: deal.url,                  originalLink: deal.url,                  revenueId: revenueId || null,                  startTime: null,                  endTime: null,                  voucherCode: null,                  voucherAudience: null,                  voucherPercentageSaving: voucherPct,                  voucherMoneySaving: null,                  voucherType: null,                  offerExclusive: false,                  offerScope: null,                  globalId: deal.productKey || null,                  inStock: deal.inStock !== false,                  contractProvider: null,                  contractMinutes: null,                  contractTexts: null,                  contractData: null,                  contractLength: null,                  contractMonthlyPrice: null,                  contractCurrency: currency || 'USD'                }              },              merchant: {                id: deal.merchantId ? parseInt(deal.merchantId) : null,                name: deal.merchant || "Retailer",                url: deal.merchantUrl || null,                network: deal.merchantNetwork || null              },              model: {                id: deal.modelId ? parseInt(deal.modelId) : null,                brand: deal.modelBrand || deal.brand || null,                name: deal.productName || deal.title || "",                parent: deal.modelParent || null              }            };         });                  trackHawkEvent({             clickType: "appeared",             widgetId: widgetId,             productCategoryName: "deals",             zeroBasedProductIndexOrNull: null,             totalDealsOrProducts: deals.length,             productsArray: productsArray,             queryName: queryName,             widgetTypeName: widgetTypeName         });      }      // 1. Setup Shadow DOM Sandbox      const currentScript = document.currentScript;      let hostContainer = null;      let template = null;            if (currentScript) {        let prev = currentScript.previousElementSibling;        while (prev) {          if (prev.tagName === 'TEMPLATE' && prev.classList.contains('tg-df-widget-template')) {            template = prev;          } else if (prev.tagName === 'DIV' && prev.classList.contains('tg-df-widget-host') && !prev.hasAttribute('data-initialized')) {            hostContainer = prev;            break;          }          prev = prev.previousElementSibling;        }      }            // Fallbacks in case script is deferred      if (!hostContainer) {        const hosts = document.querySelectorAll('.tg-df-widget-host:not([data-initialized])');        if (hosts.length > 0) hostContainer = hosts[0];      }            // Safely embedded template for CMS environments      const rawTemplate = `  \x3Cstyle>    /* --- Shadow DOM Base Reset --- */    *, *::before, *::after {      box-sizing: border-box;    }    img, picture, svg, video {      max-width: 100%;      height: auto;      display: block;    }    /*       1. Scoped CSS for Tom's Guide Deals Widget       All classes are prefixed with \`tg-df-\` to prevent CMS style leakage.    */    .tg-df-container {      container-type: inline-size;      container-name: tg-df;      --tg-df-blue: #1F69FF;      --tg-df-blue-hover: #004d8c;      --tg-df-text: #222222;      --tg-df-text-muted: #555555;      --tg-df-bg: #ffffff;      --tg-df-bg-secondary: #f4f4f4;      --tg-df-border: #e2e8f0;      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;      color: var(--tg-df-text);      background-color: transparent;       width: 100%;      max-width: 1200px;      margin: 0 auto;      padding-bottom: 24px;    }    .tg-df-container *, .tg-df-container *::before, .tg-df-container *::after {      margin: 0;      padding: 0;      box-sizing: border-box;    }    .tg-df-container img {      border: none;      margin: 0;      padding: 0;    }    .tg-df-container a {      text-decoration: none;      color: inherit;    }    /*       2. Search & Filter Bar    */    .tg-df-controls {      display: flex;      flex-direction: column;      align-items: center;      gap: 20px;      margin-bottom: 32px;      width: 100%;      position: relative;      z-index: 20;    }    .tg-df-top-bar {      display: flex;      width: 100%;      max-width: 760px;      gap: 12px;      margin: 0 auto;      align-items: center;    }    .tg-df-search-wrapper {      position: relative;      flex: 1;      width: 100%;      box-shadow: 0 8px 24px rgba(0,0,0,0.06);      border-radius: 40px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      z-index: 100;    }    .tg-df-autocomplete-dropdown {      position: absolute;      top: calc(100% + 4px);      left: 0;      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      max-height: 300px;      overflow-y: auto;      z-index: 200;      display: none;    }    .tg-df-autocomplete-dropdown.active {      display: block;    }    .tg-df-autocomplete-item {      padding: 12px 24px;      cursor: pointer;      font-size: 14px;      color: var(--tg-df-text);      transition: background 0.1s ease;    }    .tg-df-autocomplete-item:hover {      background: var(--tg-df-bg-secondary);    }    .tg-df-search-input {      width: 100%;      padding: 16px 64px 16px 24px;      font-size: 16px;      border: 2px solid transparent;      border-radius: 40px;      outline: none;      transition: border-color 0.2s ease, box-shadow 0.2s ease;      color: var(--tg-df-text);      background: transparent;    }    .tg-df-search-input:focus {      border-color: transparent;      box-shadow: 0 0 0 3px rgba(0, 108, 196, 0.15);    }    .tg-df-search-input::placeholder {      color: #999999;    }        .tg-df-search-btn {      position: absolute;      right: 8px;      top: 50%;      transform: translateY(-50%);      width: 40px;      height: 40px;      border-radius: 50%;      background: #222;      border: none;      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: background 0.2s ease;    }        .tg-df-search-btn:hover {      background: #000;    }    .tg-df-search-icon {      width: 16px;      height: 16px;      fill: #fff;    }    .tg-df-settings-wrapper {      position: relative;    }        .tg-df-settings-btn {      width: 48px;      height: 48px;      border-radius: 50%;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      box-shadow: 0 4px 12px rgba(0,0,0,0.04);      display: flex;      align-items: center;      justify-content: center;      cursor: pointer;      transition: all 0.2s ease;      color: var(--tg-df-text-muted);      flex-shrink: 0;    }    .tg-df-settings-btn:hover {      background: var(--tg-df-bg-secondary);      border-color: #0000ff;      color: var(--tg-df-text);    }    .tg-df-settings-btn svg {      width: 24px;      height: 24px;      fill: currentColor;    }    .tg-df-settings-dropdown {      position: absolute;      top: calc(100% + 8px);      right: 0;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 12px;      box-shadow: 0 8px 32px rgba(0,0,0,0.12);      width: 280px;      padding: 20px;      display: none;      z-index: 100;      flex-direction: column;      gap: 20px;    }    .tg-df-settings-dropdown.active {      display: flex;    }        .tg-df-settings-dropdown-backdrop {      display: none;      position: fixed;      inset: 0;      z-index: 99;    }        .tg-df-settings-dropdown-backdrop.active {      display: block;    }    .tg-df-setting-item {      display: flex;      flex-direction: column;      gap: 10px;    }    .tg-df-setting-label {      font-size: 11px;      font-weight: 700;      color: var(--tg-df-text-muted);      text-transform: uppercase;      letter-spacing: 0.5px;    }        .tg-df-region-select {        padding: 10px 12px;        border-radius: 8px;        border: 1px solid var(--tg-df-border);        font-size: 15px;        outline: none;        background: var(--tg-df-bg-secondary);        color: var(--tg-df-text);        cursor: pointer;        width: 100%;    }    .tg-df-toggle {        position: relative;        display: inline-block;        width: 44px;        height: 24px;        flex-shrink: 0;    }    .tg-df-toggle input {        opacity: 0;        width: 0;        height: 0;    }    .tg-df-slider {        position: absolute;        cursor: pointer;        top: 0; left: 0; right: 0; bottom: 0;        background-color: #ccc;        transition: .2s;        border-radius: 24px;    }    .tg-df-slider:before {        position: absolute;        content: "";        height: 18px;        width: 18px;        left: 3px;        bottom: 3px;        background-color: white;        transition: .2s;        border-radius: 50%;    }    .tg-df-toggle input:checked + .tg-df-slider {        background-color: #1F69FF;    }    .tg-df-toggle input:checked + .tg-df-slider:before {        transform: translateX(20px);    }    .tg-df-dl-row {        flex-direction: row;        align-items: center;        justify-content: space-between;    }    .tg-df-dl-row-text {        font-size: 14px;        font-weight: 600;        color: var(--tg-df-text);    }    .tg-df-dl-row-subtext {        font-size: 12px;        font-weight: 400;        line-height: 1.3;        color: var(--tg-df-text-muted);        margin-top: 4px;        display: block;    }    .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {      display: grid;      width: 100%;      grid-template-columns: repeat(4, 1fr);      gap: 12px;      margin: 0 auto;      max-width: 800px;    }                 .tg-df-sort-wrapper {      position: relative;      display: flex;      align-items: center;      width: 100%;    }        .tg-df-sort-icon {      position: absolute;      left: 14px;      width: 14px;      height: 14px;      fill: var(--tg-df-text-muted);      pointer-events: none;    }    .tg-df-sort-select, .tg-df-filter-select {      width: 100%;      padding: 10px 36px 10px 38px;      font-size: 14px;      border: 1px solid var(--tg-df-border);      border-radius: 100px;      outline: none;      appearance: none;      background-color: var(--tg-df-bg-secondary);      background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12'%3E%3Cpath fill='%23555555' d='M6 8L1 3h10z'/%3E%3C/svg%3E");      background-repeat: no-repeat;      background-position: right 14px center;      color: var(--tg-df-text);      cursor: pointer;      font-weight: 500;      transition: all 0.2s ease;    }        .tg-df-price-input::-webkit-outer-spin-button,    .tg-df-price-input::-webkit-inner-spin-button {      -webkit-appearance: none;      margin: 0;    }    .tg-df-price-input {      -moz-appearance: textfield;    }    .tg-df-sort-select:hover, .tg-df-filter-select:hover {      background-color: #e2e8f0;    }    .tg-df-multiselect-container {      position: relative;    }    @container tg-df (max-width: 768px) {      .tg-df-filters-container {      position: relative;      width: 100%;      max-width: 800px;    }    .tg-df-scroll-btn {      display: none;      position: absolute;      top: 50%;      transform: translateY(-50%);      width: 32px;      height: 32px;      background: white;      border: 1px solid var(--tg-df-border);      border-radius: 50%;      align-items: center;      justify-content: center;      cursor: pointer;      z-index: 10;      box-shadow: 0 2px 8px rgba(0,0,0,0.1);      color: var(--tg-df-text-primary);      padding: 0;    }    .tg-df-scroll-btn svg {      width: 16px;      height: 16px;    }    .tg-df-scroll-btn:hover {      background: #f4f4f4;    }    .tg-df-scroll-btn.left {      left: 0px;    }    .tg-df-scroll-btn.right {      right: 0px;    }    @container tg-df (max-width: 768px) {      .tg-df-scroll-btn {        display: flex;        top: 22px; /* vertically center within the 44px high filter buttons */      }    }    .tg-df-filters {        width: 100%;        margin: 0;        margin-bottom: -320px;        padding: 0 16px 320px 16px;        display: flex;        flex-wrap: nowrap;        gap: 8px;        overflow-x: auto;        overflow-y: hidden;        pointer-events: none;        scrollbar-width: none;        -webkit-overflow-scrolling: touch;      }      .tg-df-filters::-webkit-scrollbar {        display: none;      }      .tg-df-sort-wrapper {        pointer-events: auto;        flex: 0 0 auto;        width: 175px;        min-width: 175px;      }    }        .tg-df-multiselect-trigger {      display: block;      background: #fff;      user-select: none;      width: 100%;      overflow: hidden;      white-space: nowrap;      text-overflow: ellipsis;    }        .tg-df-multiselect-dropdown {      display: none;      position: absolute;      top: calc(100% + 4px);      left: 0;      width: 100%;      min-width: 220px;      max-height: 300px;      overflow-y: auto;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);      z-index: 100;      padding: 8px 0;    }    .tg-df-multiselect-dropdown.active {      display: block;    }    .tg-df-ms-option {      padding: 8px 16px;      display: flex;      align-items: center;      gap: 8px;      cursor: pointer;      font-size: 14px;    }    .tg-df-ms-option:hover {      background-color: var(--tg-df-bg-secondary);    }        .tg-df-ms-option input {      cursor: pointer;      accent-color: #1f69ff;    }    .tg-df-sort-select:focus, .tg-df-filter-select:focus {      border-color: #0000ff;      box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.2);      background-color: var(--tg-df-bg);    }    /*       3. Deal Grid Layout    */    .tg-df-grid.tg-df-grid-auto {      padding-top: 24px;    }    .tg-df-grid, .tg-df-grid.layout-grid {      display: grid;      grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));      gap: 10px;    }    .tg-df-grid.layout-row {      grid-template-columns: 1fr;      gap: 16px;    }        .tg-df-grid.layout-row .tg-df-card {      flex-direction: row;      align-items: stretch;      height: auto;      box-shadow: none;      border-bottom: 1px solid var(--tg-df-border);    }    .tg-df-grid.layout-row .tg-df-card:hover {      box-shadow: none;    }    .tg-df-grid.layout-row .tg-df-card-image-box {      width: 140px;      min-width: 140px;      aspect-ratio: 3/4;      border-right: none;      padding: 16px 16px 16px 32px;    }    .tg-df-grid.layout-row .tg-df-card-body {      padding: 16px;      justify-content: space-between;    }    .tg-df-grid.layout-row .tg-df-card-title {      font-size: 15px;      margin-bottom: 16px;    }    .tg-df-grid.layout-row .tg-df-card-stars { margin-bottom: 8px; }    .tg-df-grid.layout-row .tg-df-card-footer {      flex-direction: column;      align-items: flex-start;      gap: 0;    }    .tg-df-grid.layout-row .tg-df-card-merchant-pill {      margin-bottom: 4px;    }    .tg-df-grid.layout-row .tg-df-card-price-group {      margin-bottom: 8px;    }    .tg-df-grid.layout-row .tg-df-price-group {      width: auto;    }    .tg-df-grid.layout-row .tg-df-card-cta {      width: 100%;      max-width: 200px;      padding: 10px 24px;      font-size: 13px;      flex-shrink: 0;      text-align: center;      justify-content: center;    }    /*       4. Deal Card Design    */    .tg-df-card {      position: relative;      display: flex;      flex-direction: column;      background-color: #ffffff;      border-radius: 0;      overflow: hidden;      transition: transform 0.2s ease, box-shadow 0.2s ease;      text-decoration: none;      color: inherit;      height: 100%;      box-shadow: 0 0 16px rgba(0, 0, 0, 0.08);      border: 1px solid var(--tg-df-border);    }    .tg-df-card:hover {      box-shadow: 0 0 24px rgba(0, 0, 0, 0.12);    }    .tg-df-card-image-box {      width: 100%;      aspect-ratio: 3/4;      background-color: #f8f8f8;      display: flex;      align-items: center;      justify-content: center;      position: relative;      overflow: hidden;      padding: 32px;      flex: 0 0 auto;    }    .tg-df-card-image {      max-width: 100%;      max-height: 100%;      width: auto;      height: auto;      object-fit: contain;      mix-blend-mode: multiply; /* Helps white background images blend into secondary bg */      transition: transform 0.3s ease;    }    .tg-df-card:hover .tg-df-card-image {      transform: scale(1.05); /* Zoom in on hover */    }    .tg-df-card-discount-badge {      position: absolute;      top: 12px;      left: 12px;      background: #dc2626; /* Red */      color: #ffffff;      padding: 6px 8px;      font-size: 11px;      font-weight: 500;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      z-index: 10;    }        .tg-df-card-merchant-pill {      display: block;      padding: 0;      font-size: 11px;      font-weight: 600;      text-transform: uppercase;      letter-spacing: 0.5px;      border-radius: 0;      color: var(--tg-df-text-muted);      margin-bottom: 8px;      white-space: nowrap;      overflow: hidden;      text-overflow: ellipsis;    }    .tg-df-card-body {      padding: 16px;      display: flex;      flex-direction: column;      flex-grow: 1;      min-width: 0;    }    .tg-df-card-badges {      display: flex;      flex-wrap: wrap;      gap: 6px;      margin-bottom: 8px;    }    .tg-df-tag {      display: inline-flex;      align-items: center;      padding: 4px 6px;      font-size: 11px;      font-weight: 700;      text-transform: uppercase;      border-radius: 4px;      gap: 4px;    }    .tg-df-tag-prime {      background-color: #00A8E1;      color: #fff;    }    .tg-df-tag-coupons {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-coupons:hover {      background-color: #e2e8f0;    }        .tg-df-tag-outline {      background-color: #f1f5f9;      color: #334155;      border: 1px solid #cbd5e1;      cursor: pointer;      transition: background-color 0.2s;    }    .tg-df-tag-outline:hover {      background-color: #e2e8f0;    }        @keyframes tg-df-spin {      0% { transform: rotate(0deg); }      100% { transform: rotate(360deg); }    }    .tg-df-coupon-spinner {      border: 2px solid #e2e8f0;      border-top: 2px solid #3b82f6;      border-radius: 50%;      width: 14px;      height: 14px;      animation: tg-df-spin 1s linear infinite;      margin: 4px 8px;      display: inline-block;    }        /* Vouchers Modal */    .tg-df-modal-backdrop {      position: fixed;      top: 0; left: 0; right: 0; bottom: 0;      background: rgba(0,0,0,0.5);      z-index: 10000;      display: flex;      align-items: center;      justify-content: center;      opacity: 0;      pointer-events: none;      transition: opacity 0.3s;    }    .tg-df-modal-backdrop.active {      opacity: 1;      pointer-events: auto;    }    .tg-df-modal {      background: #fff;      border-radius: 12px;      width: 90%;      max-width: 400px;      max-height: 80vh;      display: flex;      flex-direction: column;      box-shadow: 0 10px 40px rgba(0,0,0,0.2);      transform: translateY(20px);      transition: transform 0.3s;    }    .tg-df-modal-backdrop.active .tg-df-modal {      transform: translateY(0);    }    .tg-df-modal-header {      padding: 16px;      border-bottom: 1px solid #e2e8f0;      display: flex;      align-items: center;      justify-content: space-between;    }    .tg-df-modal-title {      font-size: 16px;      font-weight: 600;      margin: 0;    }    .tg-df-modal-close {      background: none;      border: none;      cursor: pointer;      padding: 4px;      color: #64748b;    }    .tg-df-modal-body {      padding: 16px;      overflow-y: auto;    }    .tg-df-voucher-item {      padding: 12px;      border: 1px dashed #cbd5e1;      border-radius: 8px;      margin-bottom: 10px;      background: #f8fafc;      display: flex;      align-items: center;      gap: 12px;      text-decoration: none;      color: inherit;      transition: background-color 0.2s, border-color 0.2s;    }    .tg-df-voucher-item:hover {      background: #f1f5f9;      border-color: #94a3b8;    }    .tg-df-voucher-item:last-child {      margin-bottom: 0;    }    .tg-df-voucher-logo {      width: 48px;      height: 48px;      object-fit: contain;      border-radius: 4px;      background: #fff;      border: 1px solid #e2e8f0;      flex-shrink: 0;    }    .tg-df-voucher-content {      flex: 1;      min-width: 0;    }    .tg-df-voucher-title {      font-size: 14px;      font-weight: 600;      margin: 0 0 4px 0;      line-height: 1.3;      color: #0f172a;    }    .tg-df-voucher-expiry {      font-size: 12px;      color: #64748b;      display: flex;      align-items: center;      gap: 4px;      margin-top: 6px;    }    .tg-df-voucher-code {      display: inline-flex;      align-items: center;      background: #f1f5f9;      border: 1px dashed #cbd5e1;      padding: 6px 10px;      font-family: monospace;      font-weight: 700;      font-size: 14px;      color: #0f172a;      border-radius: 4px;      margin-top: 8px;      cursor: pointer;      transition: all 0.2s ease;    }    .tg-df-voucher-code:hover {      background: #e2e8f0;      border-color: #94a3b8;    }    .tg-df-voucher-code.copied {      background: #ecfdf5;      border-color: #10b981;      color: #10b981;    }    .tg-df-voucher-cta {      display: inline-block;      margin-top: 8px;      font-size: 13px;      font-weight: 600;      color: #2563eb;      text-decoration: none;    }    .tg-df-card-title {      font-size: 15px;      font-weight: 400;      line-height: 1.4;      margin: 0 0 12px 0;      color: var(--tg-df-text);    }    .tg-df-card-footer {      margin-top: auto;      display: flex;      flex-direction: column;      width: 100%;    }    .tg-df-card-price-group {      display: flex;      flex-direction: row;      align-items: center;      gap: 8px;      margin-bottom: 12px;    }    .tg-df-card-price {      font-size: 16px;      font-weight: 700;      color: #dc2626; /* Red price */      line-height: 1;    }        .tg-df-card-msrp {      font-size: 13px;      color: var(--tg-df-text-muted);      text-decoration: line-through;    }    .tg-df-container .tg-df-card-cta {      display: flex;      align-items: center;      justify-content: center;      width: 100%;      box-sizing: border-box;      background-color: #1f69ff;      color: #ffffff;      font-size: 12px;      font-weight: 700;      text-transform: uppercase;      letter-spacing: 0.5px;      padding: 12px 16px;      border-radius: 0;      border: none;      cursor: pointer;      transition: background-color 0.2s ease;    }    .tg-df-card:hover .tg-df-card-cta,    .tg-df-card-cta:hover {      background-color: #1555cc;    }    /*       5. State & Skeleton Styles    */    .tg-df-message {      grid-column: 1 / -1;      text-align: center;      padding: 48px 24px;      color: var(--tg-df-text-muted);      font-size: 16px;      background: var(--tg-df-bg);      border: 1px solid var(--tg-df-border);      border-radius: 8px;    }    @keyframes tg-df-shimmer {      0% { background-position: -200% 0; }      100% { background-position: 200% 0; }    }    .tg-df-skeleton {      background: linear-gradient(90deg, var(--tg-df-bg-secondary) 25%, #e2e8f0 50%, var(--tg-df-bg-secondary) 75%);      background-size: 200% 100%;      animation: tg-df-shimmer 1.5s infinite;      border-radius: 4px;    }    .tg-df-skeleton-img {      width: 100%;      height: 100%;      position: absolute;      top: 0; left: 0;    }        .tg-df-skeleton-text {      height: 16px;      margin-bottom: 8px;      width: 100%;    }    .tg-df-skeleton-text.short { width: 40%; }    .tg-df-skeleton-text.title { height: 20px; margin-bottom: 16px; }    /* Editor Floating Bar & Elements */    .tg-df-editor-bar {      position: sticky;      top: 120px;      z-index: 1000;      background: #111827;      color: #fff;      padding: 12px 16px;      border-radius: 8px;      margin-bottom: 16px;      display: flex;      align-items: center;      justify-content: space-between;      box-shadow: 0 4px 12px rgba(0,0,0,0.15);    }    .tg-df-editor-bar-text {      font-weight: 600;      font-size: 14px;    }    .tg-df-editor-copy-btn {      background: #10b981;      color: #fff;      padding: 6px 16px;      border: none;      border-radius: 4px;      font-weight: 600;      cursor: pointer;      display: flex;      align-items: center;      font-size: 13px;    }    .tg-df-editor-copy-btn:hover { background: #059669; }        .tg-df-deal-checkbox {      position: absolute;      top: 12px;      right: 12px;      z-index: 10;      width: 20px;      height: 20px;      cursor: pointer;      pointer-events: auto;    }    /*       6. Mobile List View (Stacks into a cleaner horizontal row/list)    */    @container tg-df (max-width: 599px) {      .tg-df-controls {        padding: 16px 16px 8px;      }            .tg-df-top-bar {        width: 100%;      }            .tg-df-settings-dropdown {        position: fixed;        top: auto;        bottom: 0;        left: 0;        right: 0;        width: 100%;        border-radius: 20px 20px 0 0;        padding: 24px;        box-shadow: 0 -8px 32px rgba(0,0,0,0.15);        z-index: 1000;        border: none;        border-top: 1px solid var(--tg-df-border);      }            .tg-df-settings-dropdown-backdrop.active {        background: rgba(0,0,0,0.4);      }            .tg-df-search-wrapper {        box-shadow: 0 0 16px rgba(0,0,0,0.08);      }                  .tg-df-sort-wrapper.tg-df-price-range-wrapper {        flex: 0 0 auto;        min-width: max-content;        width: auto;      }            .tg-df-sort-select, .tg-df-filter-select {        width: 100%;        text-align: left;        padding: 10px 24px 10px 32px;        background-position: right 8px center;        text-overflow: ellipsis;        white-space: nowrap;        overflow: hidden;      }      .tg-df-sort-icon {        left: 10px;      }      .tg-df-grid:not(.layout-grid):not(.layout-row),      .tg-df-grid.layout-row {        grid-template-columns: 1fr;        gap: 16px;      }            .tg-df-grid.tg-df-grid-auto {        padding-top: 24px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card,      .tg-df-grid.layout-row .tg-df-card {        flex-direction: row;        align-items: stretch;        height: auto;        box-shadow: none; /* simple line on mobile if preferred, or keep */        border-bottom: 1px solid var(--tg-df-border);      }      .tg-df-grid.tg-df-grid-auto .tg-df-card:hover,      .tg-df-grid.layout-row .tg-df-card:hover {        box-shadow: none;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-image-box,      .tg-df-grid.layout-row .tg-df-card-image-box {        width: 120px;        min-width: 120px;        aspect-ratio: 3/4;        border-right: none;        padding: 12px;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-body,      .tg-df-grid.layout-row .tg-df-card-body {        padding: 12px;        justify-content: space-between;      }      .tg-df-grid.tg-df-grid-auto .tg-df-card-title,      .tg-df-grid.layout-row .tg-df-card-title {        font-size: 14px;        margin-bottom: 12px;      }      /* Single column mobile grid override */      .tg-df-grid.layout-grid {        grid-template-columns: 1fr;        gap: 16px;      }      .tg-df-grid.layout-grid .tg-df-card-image-box {        padding: 12px;      }      .tg-df-grid.layout-grid .tg-df-card-body {        padding: 10px;      }      .tg-df-grid.layout-grid .tg-df-card-title {        font-size: 13px;        margin-bottom: 8px;      }      .tg-df-grid.layout-grid .tg-df-card-price {        font-size: 14px;      }            .tg-df-card-footer {        flex-direction: column;        align-items: stretch;        gap: 0;        width: 100%;        min-width: 0;      }      .tg-df-card-merchant-pill {        margin-bottom: 4px;      }      .tg-df-card-price-group {        flex: 1 1 auto;        margin-bottom: 8px;      }      .tg-df-card-price {        font-size: 16px;      }      .tg-df-card-msrp {        display: block;       }      .tg-df-grid.layout-row .tg-df-card-cta,      .tg-df-container .tg-df-card-cta {        width: 100%;        max-width: none;        min-width: 0;        box-sizing: border-box;        padding: 8px 16px;        font-size: 12px;        flex: 0 0 auto;        text-align: center;        white-space: normal;        line-height: 1.2;      }    }    .tg-df-container.is-carousel {      min-height: 760px;      background-color: #E7F0FF;      padding: 0 0 24px 0;      border-radius: 24px;      width: 100vw;      max-width: 1200px;      position: relative;      left: 50%;      transform: translateX(-50%);    }    .tg-df-container.is-carousel.hide-header-details {      min-height: 480px;    }    /*       7. Carousel View Mode    */    .tg-df-container .tg-df-carousel-host {      /* Layout is now handled by container wrapper */    }    .tg-df-container .tg-df-carousel-eyebrow {      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      padding: 24px 16px 0 16px;      display: none;    }    .tg-df-container .tg-df-carousel-query-title {      color: #011535;      font-size: 28px;      font-weight: 600;      padding: 0 16px 24px 16px;      line-height: 1.2;      display: none;    }    .tg-df-container .tg-df-carousel-blue-box {      background-color: transparent;      border-radius: 0;      padding: 24px 24px 0 24px;      margin: 0;      color: #1F69FF;          position: relative;      overflow: hidden;    }    .tg-df-container .tg-df-carousel-bg-circle-1 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-2 {      display: none;    }    .tg-df-container .tg-df-carousel-bg-circle-3 {      display: none;    }    .tg-df-container .tg-df-carousel-box-content {      position: relative;      z-index: 10;    }    .tg-df-container .tg-df-carousel-box-eyebrow {      background-color: transparent;      color: #1F69FF;      font-weight: 700;      font-size: 14px;      text-transform: uppercase;      letter-spacing: 1px;      display: inline-block;      padding: 0;      border-radius: 0;    }    .tg-df-container .tg-df-carousel-box-title {      font-size: 28px;      font-weight: 600;      line-height: 1.2;      margin-top: 8px;      color: #1e293b;    }    .tg-df-container .tg-df-countdown-wrapper {      position: absolute;      top: 0;      right: 0;      display: flex;      flex-direction: column;      align-items: flex-end;      gap: 12px;      transform: scale(0.67);      transform-origin: top right;    }    .tg-df-container .tg-df-countdown-title {      font-size: 14px;      font-weight: 600;      color: #011535;      margin: 0;    }    .tg-df-container .tg-df-countdown-blocks {      display: flex;      gap: 16px;    }    .tg-df-container .tg-df-countdown-item {      display: flex;      flex-direction: column;      align-items: center;      gap: 4px;    }    .tg-df-container .tg-df-countdown-box {      width: 59px;      height: 59px;      background: #03FE9E;      border-radius: 15px;      display: flex;      align-items: center;      justify-content: center;    }    .tg-df-container .tg-df-countdown-num {      font-family: 'Inter', sans-serif;      font-weight: 700;      font-size: 20px;      line-height: normal;      color: #011535;    }    .tg-df-container .tg-df-countdown-label {      font-family: 'Inter', sans-serif;      font-weight: 500;      font-size: 16px;      line-height: normal;      color: #1e293b;      text-transform: uppercase;    }    .tg-df-container .tg-df-carousel-box-subtitle {      font-size: 16px;      margin-top: 8px;      font-weight: 300;      color: #1e293b;      line-height: 24px;    }    .tg-df-container .tg-df-carousel-roundels-wrapper {      position: relative;      margin-top: 24px;      margin-left: -24px;      margin-right: -24px;    }    .tg-df-container .tg-df-carousel-roundels {      display: flex;      gap: 16px;      overflow-x: auto;            scrollbar-width: none;      padding-top: 12px;      padding-bottom: 24px;      padding-left: 24px;      padding-right: 24px;      margin-left: 0;      margin-right: 0;    }        .tg-df-container .tg-df-carousel-scroll-left,    .tg-df-container .tg-df-carousel-scroll-right {      position: absolute;      top: 50%;      transform: translateY(-50%);      height: 36px;      width: 36px;      display: flex;      align-items: center;      justify-content: center;      border-radius: 50%;      background-color: #ffffff;      border: 1px solid #e2e8f0;      box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);      color: #1F69FF;      cursor: pointer;      transition: all 0.2s;      margin-top: -4px;      z-index: 20;    }    .tg-df-container .tg-df-carousel-scroll-left { left: 8px; }    .tg-df-container .tg-df-carousel-scroll-right { right: 8px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-left { left: 0px; }    .tg-df-carousel-filters-outer .tg-df-carousel-scroll-right { right: 0px; }    .tg-df-carousel-filters-outer { margin-left: -24px; margin-right: -24px; padding-left: 24px; padding-right: 24px; }    .tg-df-grid-wrapper { position: relative; }    @container tg-df (max-width: 599px) { .tg-df-carousel-filters-outer { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; } }        .tg-df-container .tg-df-carousel-scroll-left:hover,    .tg-df-container .tg-df-carousel-scroll-right:hover {      background-color: rgba(255, 255, 255, 0.6);    }    .tg-df-container .tg-df-carousel-roundels::-webkit-scrollbar {      display: none;    }    .tg-df-container .tg-df-roundel {      display: flex;      flex-direction: column;      align-items: center;      gap: 8px;      cursor: pointer;      min-width: 120px;      flex-shrink: 0;    }    .tg-df-container .tg-df-roundel-img-box {      width: 120px;      height: 120px;      border-radius: 50%;      background: white;      display: flex;      align-items: center;      justify-content: center;      overflow: hidden;      box-shadow: 0px 3px 14px 0px rgba(30, 41, 59, 0.08);      transition: box-shadow 0.2s;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel.active .tg-df-roundel-img-box {      box-shadow: 0 0 0 2px #E7F0FF, 0 0 0 4px #1F69FF;    }    .tg-df-container .tg-df-roundel:hover .tg-df-roundel-img-box img {      transform: scale(1.08);    }    .tg-df-container .tg-df-roundel-img-box img {      width: 100%;      height: 100%;      object-fit: contain;      padding: 10px;      box-sizing: border-box;      transition: transform 0.3s ease;    }    .tg-df-container .tg-df-roundel-label {      font-size: 13px;      font-weight: 400;      color: #1e293b;      text-align: center;    }    .tg-df-container .tg-df-carousel-filters-label {      font-size: 16px;      font-weight: 400;      color: #1e293b;      white-space: nowrap;      margin-right: 4px;    }    .tg-df-container .tg-df-carousel-filters-wrap {      display: flex;      align-items: center;      flex-wrap: nowrap;      gap: 8px;      margin-top: 8px;      overflow-x: auto;      scrollbar-width: none;      -webkit-overflow-scrolling: touch;      padding-bottom: 8px;      margin-left: -24px;      margin-right: -24px;      padding-left: 24px;      padding-right: 24px;    }    .tg-df-container .tg-df-carousel-filters-wrap::-webkit-scrollbar {      display: none;    }        .tg-df-container .tg-df-carousel-filter-btn img,    .tg-df-container .tg-df-carousel-filter-btn picture {      height: 20px;      width: 20px;      object-fit: contain;      object-position: center;      display: inline-flex;      align-items: center;      justify-content: center;      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn picture img {      margin-right: 0;      height: 100%;      width: 100%;    }    .tg-df-container .tg-df-carousel-filter-btn img.active-img,    .tg-df-container .tg-df-carousel-filter-btn picture:has(.active-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.inactive-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.inactive-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.inactive-img) {      display: none;    }    .tg-df-container .tg-df-carousel-filter-btn:hover img.active-img,    .tg-df-container .tg-df-carousel-filter-btn.active img.active-img,    .tg-df-container .tg-df-carousel-filter-btn:hover picture:has(.active-img),    .tg-df-container .tg-df-carousel-filter-btn.active picture:has(.active-img) {      display: inline-flex;    }    .tg-df-container .tg-df-carousel-filter-btn {      background: #ffffff;      border: 2px solid #1e293b;      color: #1e293b;      border-radius: 24px;      padding: 6px 16px;      font-size: 14px;      font-weight: 600;      cursor: pointer;      transition: all 0.2s;      flex-shrink: 0;      white-space: nowrap;    }    .tg-df-container .tg-df-carousel-filter-btn svg {      margin-right: 6px;    }    .tg-df-container .tg-df-carousel-filter-btn {      display: inline-flex;      align-items: center;    }    .tg-df-container .tg-df-carousel-filter-btn:hover {      background: #1e293b;      color: white;      border-color: #1e293b;    }    .tg-df-container .tg-df-carousel-filter-btn.active {      background: #1e293b;      color: white;      border-color: #1e293b;    }        .tg-df-grid.carousel-compact {      display: flex;      flex-wrap: nowrap;      overflow-x: auto;      gap: 16px;      padding: 16px 24px;      align-items: stretch;      scrollbar-width: none;    }    .tg-df-grid.carousel-compact::-webkit-scrollbar {      display: none;    }    .tg-df-grid.carousel-compact .tg-df-card {      flex: 0 0 auto;      width: 200px;      min-height: auto;      height: auto;      display: flex;      flex-direction: column;      border-radius: 15px;      border: none;      box-shadow: 0 0 16px rgba(0,0,0,0.08);      overflow: visible;    }    .tg-df-grid.carousel-compact .tg-df-card-image-box {      padding: 12px;      background-color: transparent;      border-radius: 15px 15px 0 0;      height: 130px;    }    .tg-df-grid.carousel-compact .tg-df-card-image {      mix-blend-mode: normal;    }    .tg-df-grid.carousel-compact .tg-df-card-discount-badge {      border-radius: 0;      top: 0px;      left: 0px;      padding: 4px 8px;      font-size: 11px;    }    .tg-df-grid.carousel-compact .tg-df-card-body {      padding: 8px 12px 12px 12px;    }    .tg-df-grid.carousel-compact .tg-df-card-title {      font-size: 14px;      font-weight: 400;      margin-bottom: 8px;      color: #011535;    }    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):not(:has(.tg-df-tag-prime)):not(:has(.tg-df-coupon-wrapper:not([style*="none"]))) > .tg-df-card-title,    .tg-df-grid.carousel-compact .tg-df-card-body:not(:has(.tg-df-card-stars)):has(> .tg-df-card-title:first-child) > .tg-df-card-title {    }    .tg-df-grid.carousel-compact .tg-df-card-cta {      border-radius: 5px;      padding: 8px 10px;      margin-top: 4px;      background-color: #1F69FF;    }    .tg-df-grid.carousel-compact .tg-df-card-price-group {      margin-bottom: 2px;    }    .tg-df-grid.carousel-compact .tg-df-card-merchant-pill {      margin-bottom: 2px;    }    @container tg-df (max-width: 599px) {      .tg-df-container .tg-df-carousel-blue-box-title {        font-size: 24px;      }      .tg-df-container .tg-df-countdown-title {        display: none;      }      .tg-df-container .tg-df-countdown-wrapper {        position: absolute;        top: 0;        right: 0;        align-items: flex-end;        transform: scale(0.40);        transform-origin: top right;      }      .tg-df-container .tg-df-roundel {        min-width: 88px;      }      .tg-df-container .tg-df-roundel-img-box {        width: 88px;        height: 88px;      }    }    /* REPLICA BLOCK STYLES */    .tg-df-grid.layout-replica-2 { grid-template-columns: repeat(2, 1fr) !important; gap: 20px; }    .tg-df-grid.layout-replica-1 { grid-template-columns: 1fr !important; gap: 20px; }        .tg-df-container .hawk-deal-widget-container { border-bottom: 1px solid #e5e7eb; display: flex; flex-direction: column; margin: 0; padding: 20px 0; box-sizing: border-box; font-family: inherit; }    .tg-df-container .hawk-deal-widget-wrap { display: flex; flex-direction: row; align-items: flex-start; width: 100%; gap: 24px; }    .tg-df-container .hawk-deal-widget-image-container { display: flex; flex-shrink: 0; justify-content: center; width: 160px; height: 160px; align-items: center; background: white; margin-bottom: 0px; }    .tg-df-container .hawk-deal-widget-title-product-title { color: #111827; font-size: 18px; font-weight: 700; line-height: 1.4; display: inline; }    .tg-df-container .hawk-deal-widget-title-price { font-size: 18px; font-weight: 700; line-height: 1.4; white-space: nowrap; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-price-now { font-weight: 700; }    .tg-df-container .hawk-deal-widget-title-retailer-price:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-title-retailer { font-size: 18px; font-weight: 700; line-height: 1.4; color: #2563eb; }    .tg-df-container .hawk-deal-widget-title-was-price { color: #dc2626; font-size: 16px; font-weight: 500; line-height: 1.4; text-decoration: line-through; white-space: nowrap; margin-left: 8px; margin-right: 8px; }    .tg-df-container .hawk-deal-widget-text-body-container { position: relative; width: 100%; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-text-body-main { font-size: 16px; width: 100%; margin-bottom: 12px; }    .tg-df-container .hawk-deal-widget-text-body-description { display: block; font-size: 15px; margin-top: 12px; color: #4b5563; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-body-description p { margin: 0; line-height: 1.6; }    .tg-df-container .hawk-deal-widget-text-cta-container { display: flex; flex-direction: column; gap: 12px; width: 100%; flex: 1; min-width: 0; box-sizing: border-box; }    .tg-df-container .hawk-deal-widget-footer { display: flex; justify-content: flex-end; width: 100%; margin-top: auto; }    .tg-df-container .hawk-deal-widget-button-wrapper { display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-end; width: 100%; }    .tg-df-container .hawk-deal-widget-preferred-partner-wrapper { display: flex; flex-direction: row; }        @container tg-df (min-width: 600px) {      .tg-df-mobile-only { display: none !important; }    }    @container tg-df (max-width: 599px) {      .tg-df-desktop-only { display: none !important; }      .tg-df-grid.layout-replica-2 { grid-template-columns: 1fr !important; }      .tg-df-grid.savings-squad-cards { grid-template-columns: 1fr !important; display: flex; flex-direction: column; }    }    .tg-df-grid.savings-squad-cards .tg-df-card-title {      -webkit-line-clamp: unset !important;      display: block !important;      overflow: visible !important;    }    @container tg-df (max-width: 500px) {      .tg-df-container .hawk-deal-widget-wrap { display: block; }      .tg-df-container .hawk-deal-widget-image-container { display: block; float: left; margin: 0 16px 8px 0; width: 120px; max-width: 120px; height: auto; align-items: normal; justify-content: normal; }      .tg-df-container .hawk-deal-widget-text-cta-container { display: block; text-align: left; }      .tg-df-container .hawk-deal-widget-footer { display: block; margin-top: 16px; clear: both; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-deal-widget-button-wrapper .hawk-deal-widget-preferred-partner-wrapper { display: block; width: 100%; }      .tg-df-container .hawk-affiliate-link-deal-button { box-sizing: border-box !important; display: flex !important; max-width: none !important; width: 100% !important; margin: 0 !important; }    }        .tg-df-container .hawk-affiliate-link-deal-button {       align-items: center; background-color: #1f69ff; box-sizing: border-box; color: #ffffff !important; display: flex; font-size: 14px; font-weight: 700; justify-content: center; letter-spacing: 0.5px; line-height: 1; min-width: 160px; padding: 14px 24px; text-align: center; text-decoration: none; text-transform: uppercase; width: 100%; word-break: normal; border-radius: 4px; border: 0; transition: background-color 0.2s;     }    .tg-df-container .hawk-affiliate-link-deal-button:hover { background-color: #0056e0; text-decoration: none; }    .tg-df-container .hawk-lazy-image-deal-widget { display: block; height: auto; margin: auto; max-height: 160px; max-width: 100%; mix-blend-mode: multiply; object-fit: contain; }    .tg-df-container .hawk-deal-widget-text-cta-container a { color: #2563eb; text-decoration: none; display: inline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover { text-decoration: underline; }    .tg-df-container .hawk-deal-widget-text-cta-container a:has(.hawk-deal-widget-title-product-title) { color: #111827; }    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-product-title,    .tg-df-container .hawk-deal-widget-text-cta-container a:hover .hawk-deal-widget-title-retailer-price { text-decoration: underline; }    .tg-df-savings-squad-header { margin-bottom: 24px; text-align: center; display: none; }    .tg-df-banner-img-desktop { display: block; width: 100%; height: auto; margin-bottom: 32px; }    .tg-df-banner-img-mobile { display: none; width: 100%; height: auto; margin-bottom: 32px; }    @container tg-df (max-width: 600px) {      .tg-df-banner-img-desktop { display: none; }      .tg-df-banner-img-mobile { display: block; }    }    .tg-df-header-title { font-size: 28px; font-weight: 700; color: var(--tg-df-text); margin: 32px 0 12px 0; line-height: 1.3; }    .tg-df-header-subtitle { font-size: 16px; color: var(--tg-df-text-muted); margin: 0 0 32px 0; line-height: 1.5; }  \x3C/style>  \x3C!-- Widget Container --\x3E  \x3Cdiv class="tg-df-container" id="signal-deals-finder-root">    \x3Cdiv class="tg-df-savings-squad-header" id="tg-df-savings-squad-header">      \x3Cpicture>        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/xkh2og7m3d1778189998.png" alt="Deals Banner" class="tg-df-banner-img-desktop" />        \x3Cimg src="https://cdn.mos.cms.futurecdn.net/flexiimages/gmak6rtdf41778245089.png" alt="Deals Banner Mobile" class="tg-df-banner-img-mobile" />      \x3C/picture>      \x3Cdiv class="tg-df-header-text">        \x3Ch2 class="tg-df-header-title" id="tg-df-header-title">Editor's Choice Deals\x3C/h2>        \x3Cp class="tg-df-header-subtitle" id="tg-df-header-subtitle">Discover the best discounts currently available, curated daily by the Tom's Guide Savings Squad.\x3C/p>      \x3C/div>    \x3C/div>    \x3C!-- Editor Floating Bar --\x3E    \x3Cdiv class="tg-df-editor-bar" id="tg-df-editor-bar" style="display:none;">      \x3Cdiv class="tg-df-editor-bar-text" style="display: flex; align-items: center;">        \x3Cspan id="tg-df-selected-count">0\x3C/span>\x26nbsp;Deals Selected        \x3Cbutton class="tg-df-editor-clear-btn" id="tg-df-editor-clear" type="button" style="margin-left: 12px; font-size: 13px; color: #9ca3af; background: none; border: none; cursor: pointer; text-decoration: underline;">Clear All\x3C/button>      \x3C/div>      \x3Cbutton class="tg-df-editor-copy-btn" id="tg-df-editor-copy" type="button">        \x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">\x3C/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">\x3C/path>\x3C/svg>        Copy to CMS      \x3C/button>    \x3C/div>    \x3Cdiv class="tg-df-carousel-host" id="tg-df-carousel-host" style="display: none;">      \x3Cdiv class="tg-df-carousel-eyebrow">DEAL FINDER\x3C/div>      \x3Cdiv class="tg-df-carousel-query-title" id="tg-df-carousel-title-label">Best Deals\x3C/div>            \x3Cdiv class="tg-df-carousel-blue-box">        \x3Cdiv class="tg-df-carousel-bg-circle-1" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-2" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-bg-circle-3" aria-hidden="true">\x26nbsp;\x3C/div>        \x3Cdiv class="tg-df-carousel-box-content">          \x3Cdiv class="tg-df-countdown-wrapper" id="tg-df-countdown-wrapper" style="display:none;">            \x3Cdiv class="tg-df-countdown-title" id="tg-df-countdown-title">Prime Day starts in\x3C/div>            \x3Cdiv class="tg-df-countdown-blocks">              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-days">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">DAYS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-hrs">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">HRS\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-min">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">MIN\x3C/div>\x3C/div>              \x3Cdiv class="tg-df-countdown-item">\x3Cdiv class="tg-df-countdown-box">\x3Cdiv class="tg-df-countdown-num" id="tg-df-cd-sec">0\x3C/div>\x3C/div>\x3Cdiv class="tg-df-countdown-label">SEC\x3C/div>\x3C/div>            \x3C/div>          \x3C/div>          \x3Cdiv class="tg-df-carousel-box-eyebrow">DEAL FINDER\x3C/div>          \x3Cdiv class="tg-df-carousel-box-title">Find Deals Fast\x3C/div>          \x3Cdiv class="tg-df-carousel-box-subtitle">The latest deals from the biggest retailers, all in one place\x3C/div>                    \x3Cdiv class="tg-df-carousel-roundels-wrapper">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-roundels">                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Televisions" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/wcMxTsHgqu3roMbAx7RLnT-132-100.png" alt="TVs" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">TVs\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Phones" data-pr="over50">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/G3KGaRGzj24F6PUsw4bWpT-132-100.png" alt="Phones" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Phones\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Computing" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/znNvsLzx8NEgNkD9HSFSnT-132-100.png" alt="Computing" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Computing\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Gaming" data-pr="all">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/Pgew8yaRQeZFHqHjTzvBnT-132-100.png" alt="Gaming" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Gaming\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Mattresses" data-pr="over500">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/cW7xsaLyesxkHFVSiC4kmT-132-100.png" alt="Mattresses" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Mattresses\x3C/span>            \x3C/div>                      \x3Cdiv class="tg-df-roundel tg-df-carousel-cat" data-query="Audio" data-pr="over30">              \x3Cdiv class="tg-df-roundel-img-box">                 \x3Cimg src="https://cdn.mos.cms.futurecdn.net/pCvBVHuhaQVjKt3VgCjbqT-132-100.png" alt="Audio" />              \x3C/div>              \x3Cspan class="tg-df-roundel-label">Audio\x3C/span>            \x3C/div>                  \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" onclick="this.parentElement.querySelector('.tg-df-carousel-roundels').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>        \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-carousel-filters-outer" style="position: relative;">          \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>          \x3Cdiv class="tg-df-carousel-filters-wrap">                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="0">All\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_lightning">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/HqAui7w97ft2NPqBtQ5r38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/yWPQ5yyQRhUwVKzGwYbh38-600-100.png" class="active-img" alt="" /> Lightning deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-ot="amazon_prime">              \x3Cimg src="https://cdn.mos.cms.futurecdn.net/fwoVXvL79turN3Ph535m38-600-100.png" class="inactive-img" alt="" />\x3Cimg src="https://cdn.mos.cms.futurecdn.net/u75QjVpt3w2EsMimJiRo38-600-100.png" class="active-img" alt="" /> Prime deals\x3C/button>            \x3Cbutton class="tg-df-carousel-filter-btn" data-d="10">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 10% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="15">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 15% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-d="25">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-tag">\x3Cpath d="M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z">\x3C/path>\x3Ccircle cx="7.5" cy="7.5" r=".5" fill="currentColor">\x3C/circle>\x3C/svg>            Min 25% off\x3C/button>                      \x3Cbutton class="tg-df-carousel-filter-btn" data-pr="under50">              \x3Csvg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-badge-dollar-sign">\x3Cpath d="M3.85 8.62a4 4 0 0 1 4.78-4.77 4 4 0 0 1 6.74 0 4 4 0 0 1 4.78 4.78 4 4 0 0 1 0 6.74 4 4 0 0 1-4.77 4.78 4 4 0 0 1-6.75 0 4 4 0 0 1-4.78-4.77 4 4 0 0 1 0-6.76Z">\x3C/path>\x3Cpath d="M16 8h-6a2 2 0 1 0 0 4h4a2 2 0 1 1 0 4H8">\x3C/path>\x3Cpath d="M12 18V6">\x3C/path>\x3C/svg>            Under $50\x3C/button>        \x3C/div>        \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('.tg-df-carousel-filters-wrap').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3C/div>    \x3C/div>    \x3C/div>      \x3C!-- Search & Filter Controls --\x3E      \x3Cdiv class="tg-df-top-bar" id="tg-df-top-bar" style="position: relative; z-index: 100; margin: 0 auto 20px;">        \x3Cdiv class="tg-df-search-wrapper">          \x3Cinput type="text" class="tg-df-search-input" placeholder="Search for deals, products, or brands...">          \x3Cbutton type="button" class="tg-df-search-btn" aria-label="Search">              \x3Csvg class="tg-df-search-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">                \x3Cpath d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>              \x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-autocomplete-dropdown" id="tg-df-autocomplete">\x3C/div>        \x3C/div>      \x3C/div>    \x3Cdiv class="tg-df-controls" id="tg-df-controls" style="display:flex;">              \x3Cdiv class="tg-df-filters-container" style="position: relative; width: 100%; max-width: 800px; margin: 0 auto;">          \x3Cbutton class="tg-df-scroll-btn left" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: -200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M15 18l-6-6 6-6"/>\x3C/svg>          \x3C/button>          \x3Cbutton class="tg-df-scroll-btn right" style="display: none;" onclick="this.parentElement.querySelector('.tg-df-filters').scrollBy({left: 200, behavior: 'smooth'})">            \x3Csvg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\x3Cpath d="M9 18l6-6-6-6"/>\x3C/svg>          \x3C/button>          \x3Cdiv class="tg-df-filters">          \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-category-filter-wrapper" style="display: none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-category-filter" aria-label="Category">            \x3Coption value="all">All Categories\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-multiselect-container" id="tg-df-brand-filter-wrapper" style="display:none;">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M4.25 5.61C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z"/>          \x3C/svg>          \x3Cdiv class="tg-df-filter-select tg-df-multiselect-trigger" id="tg-df-brand-trigger" tabindex="0">            Any Brand          \x3C/div>          \x3Cdiv class="tg-df-multiselect-dropdown" id="tg-df-brand-dropdown">            \x3C!-- Populated via script --\x3E          \x3C/div>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper tg-df-price-range-wrapper" id="tg-df-custom-price-wrapper" style="display: flex; align-items:center; justify-content:center; padding: 10px 20px; gap: 8px; border: 1px solid var(--tg-df-border); border-radius: 100px; background-color: var(--tg-df-bg);">          \x3Cspan style="font-size:14px; font-weight:500; color:var(--tg-df-text-primary);">Price\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-min" placeholder="Min" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">          \x3Cspan style="color:var(--tg-df-text-muted)">-\x3C/span>          \x3Cinput type="number" class="tg-df-price-input" id="tg-df-custom-price-max" placeholder="Max" style="width: 48px; background: transparent; border: none; color: var(--tg-df-text-primary); outline: none; font-size: 14px; text-align: center; padding: 0;">        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-legacy-price-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-price-filter" aria-label="Filter Prices">            \x3Coption value="all">All Prices\x3C/option>            \x3Coption value="under50">Under $50\x3C/option>            \x3Coption value="50_100">$50 - $100\x3C/option>            \x3Coption value="100_200">$100 - $200\x3C/option>            \x3Coption value="200_500">$200 - $500\x3C/option>            \x3Coption value="over500">Over $500\x3C/option>          \x3C/select>        \x3C/div>        \x3Cdiv class="tg-df-sort-wrapper" id="tg-df-discount-filter-wrapper">          \x3Csvg class="tg-df-sort-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">            \x3Cpath d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"/>          \x3C/svg>          \x3Cselect class="tg-df-filter-select" id="tg-df-discount-filter" aria-label="Discount Amount">            \x3Coption value="all">Any discount\x3C/option>            \x3Coption value="5">Min 5%\x3C/option>            \x3Coption value="10">Min 10%\x3C/option>            \x3Coption value="15">Min 15%\x3C/option>            \x3Coption value="20">Min 20%\x3C/option>            \x3Coption value="25">Min 25%\x3C/option>            \x3Coption value="30">Min 30%\x3C/option>            \x3Coption value="40">Min 40%\x3C/option>            \x3Coption value="50">Min 50%\x3C/option>            \x3Coption value="60">Min 60%\x3C/option>            \x3Coption value="70">Min 70%\x3C/option>          \x3C/select>          \x3C/div>        \x3C/div>        \x3C/div>      \x3C/div>    \x3C!-- Deals Grid Wrapper --\x3E    \x3Cdiv class="tg-df-grid-wrapper tg-df-carousel-cards-wrapper" id="tg-df-grid-wrapper">      \x3Cbutton class="tg-df-carousel-scroll-left" type="button" aria-label="Scroll left" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: -200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m15 18-6-6 6-6">\x3C/path>\x3C/svg>\x3C/button>      \x3Cdiv class="tg-df-grid" id="tg-df-grid">        \x3C!-- Content populated by JavaScript --\x3E      \x3C/div>      \x3Cbutton class="tg-df-carousel-scroll-right" type="button" aria-label="Scroll right" style="display:none;" onclick="this.parentElement.querySelector('#tg-df-grid').scrollBy({left: 200, behavior: 'smooth'})">\x3Csvg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpath d="m9 18 6-6-6-6">\x3C/path>\x3C/svg>\x3C/button>    \x3C/div>        \x3C!-- Vouchers Modal --\x3E    \x3Cdiv class="tg-df-modal-backdrop" id="tg-df-vouchers-modal">      \x3Cdiv class="tg-df-modal">        \x3Cdiv class="tg-df-modal-header">          \x3Ch3 class="tg-df-modal-title" id="tg-df-vouchers-title">Available Coupons & Deals\x3C/h3>          \x3Cbutton class="tg-df-modal-close" id="tg-df-vouchers-close">            \x3Csvg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">              \x3Cline x1="18" y1="6" x2="6" y2="18">\x3C/line>              \x3Cline x1="6" y1="6" x2="18" y2="18">\x3C/line>            \x3C/svg>          \x3C/button>        \x3C/div>        \x3Cdiv class="tg-df-modal-body" id="tg-df-vouchers-content">          \x3C!-- Vouchers injected here --\x3E        \x3C/div>      \x3C/div>    \x3C/div>  \x3C/div>`;      if (!template) {        template = document.createElement('template');        template.innerHTML = rawTemplate;      }      let shadowRoot = null;      if (hostContainer && template) {        hostContainer.setAttribute('data-initialized', 'true');        shadowRoot = hostContainer.attachShadow({ mode: 'open' });        shadowRoot.appendChild(template.content.cloneNode(true));      }      class DealsFinderWidget {        constructor(config) {          this.rootNode = config.rootNode || document;          this.hostContainer = config.hostContainer || null;          this.rootId = config.rootId || 'signal-deals-finder-root';          this.root = this.rootNode.querySelector('#' + this.rootId);          if (!this.root) return;          this.widgetId = (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'widget-' + Date.now() + '-' + Math.random().toString(36).slice(2);          this.grid = this.root.querySelector('#tg-df-grid');          this.tagsContainer = this.root.querySelector('#tg-df-tags-container');          this.categoryFilter = this.root.querySelector('#tg-df-category-filter');          this.categoryFilterWrapper = this.root.querySelector('#tg-df-category-filter-wrapper');          this.searchInput = this.root.querySelector('.tg-df-search-input');          this.autocompleteDropdown = this.root.querySelector('#tg-df-autocomplete');          this.sortSelect = this.root.querySelector('.tg-df-sort-select');          this.searchBtn = this.root.querySelector('.tg-df-search-btn');                    this.settingsToggle = this.root.querySelector('#tg-df-settings-toggle');          this.settingsPanel = this.root.querySelector('#tg-df-settings-panel');          this.settingsBackdrop = this.root.querySelector('#tg-df-settings-backdrop');          this.regionSelect = this.root.querySelector('#tg-df-region-select');          this.retailerSelect = this.root.querySelector('#tg-df-retailer-select');          this.offerTypeSelect = this.root.querySelector('#tg-df-offer-type-select');          this.viewModeSelect = this.root.querySelector('#tg-df-view-mode-select');          this.rowsSelect = this.root.querySelector('#tg-df-rows-select');          this.dealModeToggle = this.root.querySelector('#tg-df-deal-mode');          this.editorModeToggle = this.root.querySelector('#tg-df-editor-mode');          this.priceFilter = this.root.querySelector('#tg-df-price-filter');          this.discountFilter = this.root.querySelector('#tg-df-discount-filter');                    this.editorBar = this.root.querySelector('#tg-df-editor-bar');          this.editorSelectedCount = this.root.querySelector('#tg-df-selected-count');          this.editorCopyBtn = this.root.querySelector('#tg-df-editor-copy');          this.editorClearBtn = this.root.querySelector('#tg-df-editor-clear');                    this.apiUrl = 'https://search-api.fie.future.net.uk/widget.php';          this.deals = [];          this.displayLimit = 12;          this.airedaleArticles = null;          this.airedaleTags = [];          this.airedaleTagCounts = {};          this.activeDealTag = null;          this.selectedBrands = [];          this.currentQuery = '';          this.editorMode = this.hostContainer ? this.hostContainer.hasAttribute('data-editor-mode') : false;          this.viewModeOverride = this.hostContainer ? this.hostContainer.getAttribute('data-view-mode') : null;          this.selectedDeals = new Map();                    this.brandFilterWrapper = this.root.querySelector('#tg-df-brand-filter-wrapper');          this.brandTrigger = this.root.querySelector('#tg-df-brand-trigger');          this.brandDropdown = this.root.querySelector('#tg-df-brand-dropdown');                    this.customPriceWrapper = this.root.querySelector('#tg-df-custom-price-wrapper');          this.customPriceMin = this.root.querySelector('#tg-df-custom-price-min');          this.customPriceMax = this.root.querySelector('#tg-df-custom-price-max');          this.legacyPriceWrapper = this.root.querySelector('#tg-df-legacy-price-wrapper');          this.discountFilterWrapper = this.root.querySelector('#tg-df-discount-filter-wrapper');          this.initResizeObserver();          this.init();        }        getViewMode() {          console.log("DEBUG getViewMode -> override:", this.viewModeOverride, "editorMode:", this.editorMode);          if (this.viewModeOverride && (!this.editorMode || !this.viewModeSelect)) {            return this.viewModeOverride;          }          return (this.viewModeSelect && this.viewModeSelect.value) ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');        }        applyLayoutMode() {          if (!this.grid) return;          const mode = this.getViewMode();          console.log("[DEBUG] applyLayoutMode CALLED! mode=", mode);          this.grid.classList.remove('layout-row', 'layout-grid', 'tg-df-grid-auto', 'carousel-compact', 'layout-replica-1', 'layout-replica-2');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          const showHeaderDetails = params.get('show_header_details') !== 'false';          const carouselHost = this.root.querySelector('#tg-df-carousel-host');          const controlsDiv = this.root.querySelector('#tg-df-controls');          const topBarDiv = this.root.querySelector('#tg-df-top-bar');          const headerElement = this.root.querySelector('#tg-df-savings-squad-header');          if (headerElement) {             headerElement.style.display = (mode === 'savings_squad' && showHeaderDetails) ? 'block' : 'none';          }          if (mode === 'carousel') {             this.grid.classList.add('carousel-compact');             if (carouselHost) carouselHost.style.display = 'block';             if (controlsDiv) controlsDiv.style.display = 'none';             if (topBarDiv) topBarDiv.style.display = 'none';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.add('is-carousel');             }          } else {             if (carouselHost) carouselHost.style.display = 'none';             if (controlsDiv) controlsDiv.style.display = 'flex';             if (topBarDiv) topBarDiv.style.display = 'block';             if (this.root.classList.contains('tg-df-container')) {               this.root.classList.remove('is-carousel');             }          }          if (mode === 'grid') {            this.grid.classList.add('layout-grid');          } else if (mode === 'row') {            this.grid.classList.add('layout-row');          } else if (mode === 'savings_squad') {            this.grid.classList.add('tg-df-grid-auto', 'savings-squad-cards');          } else if (mode !== 'carousel') {            this.grid.classList.add('tg-df-grid-auto');          }                    const settingsWrapper = this.root.querySelector('.tg-df-settings-wrapper');          if (settingsWrapper) {            settingsWrapper.style.display = mode === 'auto' ? 'none' : 'block';          }          if (this.customPriceWrapper) {             this.customPriceWrapper.style.display = mode === 'auto' ? 'flex' : 'none';          }          if (this.legacyPriceWrapper) {             this.legacyPriceWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }          if (this.discountFilterWrapper) {             this.discountFilterWrapper.style.display = mode === 'auto' ? 'none' : 'flex';          }        }        initResizeObserver() {          try {            if (window.parent === window) return;          } catch (e) {            // cross origin frame check threw          }          const emitHeight = () => {            try {              const height = document.documentElement.scrollHeight || document.body.scrollHeight;              const msg = { type: 'embed-size', height: height };              if (window.parent && window.parent !== window) {                window.parent.postMessage(msg, '*');                window.parent.postMessage(JSON.stringify({ ...msg, sentinel: 'amp' }), '*');              }            } catch (e) {}          };                    if (window.ResizeObserver) {            try {              const ro = new ResizeObserver(() => emitHeight());              ro.observe(document.body);              if (this.root) ro.observe(this.root);            } catch(e){ console.warn(e); }          }          window.addEventListener('resize', emitHeight);          setTimeout(emitHeight, 300);        }        initCountdown() {          this.cdWrapper = this.root.querySelector('#tg-df-countdown-wrapper');                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          this.showCountdown = params.get('show_countdown') === 'true';          const showHeaderDetails = params.get('show_header_details') !== 'false';          const eyebrow = this.root.querySelector('.tg-df-carousel-box-eyebrow');          const title = this.root.querySelector('.tg-df-carousel-box-title');          const subtitle = this.root.querySelector('.tg-df-carousel-box-subtitle');          if (!showHeaderDetails) {            let containerElement = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (containerElement) containerElement.classList.add('hide-header-details');            if (eyebrow) eyebrow.style.display = 'none';            if (title) title.style.display = 'none';            if (subtitle) subtitle.style.display = 'none';          }          if (!this.cdWrapper) return;          this.cdTitle = this.root.querySelector('#tg-df-countdown-title');          this.cdDays = this.root.querySelector('#tg-df-cd-days');          this.cdHrs = this.root.querySelector('#tg-df-cd-hrs');          this.cdMin = this.root.querySelector('#tg-df-cd-min');          this.cdSec = this.root.querySelector('#tg-df-cd-sec');          this.updateCountdown();          this.cdInterval = setInterval(() => this.updateCountdown(), 1000);        }        updateCountdown() {          if (!this.cdWrapper) return;          if (!this.showCountdown) {            this.cdWrapper.style.display = 'none';            return;          }          const area = this.getAreaCode();          let offset = '-04:00';          if (['DE', 'FR', 'IT', 'ES', 'NL'].includes(area)) {             offset = '+02:00';          } else if (['GB', 'IE', 'UK'].includes(area)) {             offset = '+01:00';          }          const startTime = new Date('2026-06-23T00:00:00' + offset).getTime();          const endTime = new Date('2026-06-26T00:00:00' + offset).getTime();          const now = Date.now();          let targetTime = 0;          if (now < startTime) {             targetTime = startTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day starts in';             this.cdWrapper.style.display = 'flex';          } else if (now < endTime) {             targetTime = endTime;             if (this.cdTitle) this.cdTitle.textContent = 'Prime Day ends in';             this.cdWrapper.style.display = 'flex';          } else {             this.cdWrapper.style.display = 'none';             if (this.cdInterval) clearInterval(this.cdInterval);             return;          }          const diff = Math.max(0, targetTime - now);          const d = Math.floor(diff / (1000 * 60 * 60 * 24));          const h = Math.floor((diff / (1000 * 60 * 60)) % 24);          const m = Math.floor((diff / 1000 / 60) % 60);          const s = Math.floor((diff / 1000) % 60);          if (this.cdDays) this.cdDays.textContent = d;          if (this.cdHrs) this.cdHrs.textContent = h;          if (this.cdMin) this.cdMin.textContent = m;          if (this.cdSec) this.cdSec.textContent = s;        }        init() {          this.initCountdown();          try {            initAnalytics();          } catch (e) {            console.warn('Deals Widget Analytics Error:', e);          }                    this.bindEvents();                    let initialQuery = '';                    let searchSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {            searchSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {            searchSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(searchSource);          let initialViewMode = params.get('view_mode');          if (!this.viewModeOverride && initialViewMode) {            this.viewModeOverride = initialViewMode;          }          if (!params.has('search') && !params.has('q') && !params.has('query') && initialViewMode !== 'savings_squad') {             initialQuery = 'Gaming laptops';          }          const website = params.get('website') || 'tomsguide';          this.website = website;          if (website === 'techradar') {            const squadHeader = this.root.querySelector('.tg-df-savings-squad-header');            if (squadHeader) {               const pic = squadHeader.querySelector('picture');               if (pic) pic.style.display = 'none';            }            const style = document.createElement('style');            style.innerHTML = `              .tg-df-container .hawk-affiliate-link-deal-button, .tg-df-container .tg-df-card-cta { background-color: #5DAF08 !important; }              .tg-df-container .hawk-affiliate-link-deal-button:hover, .tg-df-container .tg-df-card-cta:hover { background-color: #4a8c06 !important; }            `;            this.root.appendChild(style);          }                    if (this.regionSelect) {            this.regionSelect.value = params.get('region') || 'auto';            this.updatePriceDropdownCurrency();          }                    if (this.retailerSelect && params.has('retailer')) {            this.retailerSelect.value = params.get('retailer');          }                    if (params.has('brands')) {            const b = params.get('brands');            if (b) {              this.selectedBrands = b.split(',');            }          }                    if (this.offerTypeSelect && params.has('offer_type')) {            this.offerTypeSelect.value = params.get('offer_type');          }          if (this.viewModeSelect && params.has('view_mode')) {            this.viewModeSelect.value = params.get('view_mode');          }          if (this.rowsSelect && params.has('rows')) {            this.rowsSelect.value = params.get('rows');          }          if (params.has('price')) {            const priceVal = params.get('price');            if (this.priceFilter) {               // Try assigning it directly to select. If it's not present implicitly ignores               this.priceFilter.value = priceVal;            }            if (priceVal.includes('_')) {               const parts = priceVal.split('_');               if (this.customPriceMin && parts[0]) this.customPriceMin.value = parts[0];               if (this.customPriceMax && parts[1]) this.customPriceMax.value = parts[1];            }          }          if (this.discountFilter && params.has('min_discount_ratio')) {            // Need to convert back from ratio (e.g. 0.8) to select value (e.g. "20")            const ratioStr = params.get('min_discount_ratio');            const ratioFloat = parseFloat(ratioStr);            if (!isNaN(ratioFloat)) {               const percentage = Math.round((1 - ratioFloat) * 100);               this.discountFilter.value = percentage.toString();            }          }          if (this.sortSelect) {            this.sortSelect.value = params.get('sort') || 'date_desc';          }          if (this.dealModeToggle && params.has('deal_mode')) {            this.dealModeToggle.checked = params.get('deal_mode') === 'true' || params.get('deal_mode') === '1';          }          const headerTitleEl = this.root.querySelector('#tg-df-header-title');          const headerSubtitleEl = this.root.querySelector('#tg-df-header-subtitle');          if (params.has('widget_title') && headerTitleEl) {             headerTitleEl.textContent = params.get('widget_title');          }          if (params.has('widget_subtitle') && headerSubtitleEl) {             headerSubtitleEl.textContent = params.get('widget_subtitle');          }                    // Re-apply layout after params have updated control values          this.applyLayoutMode();                    if (params.get('search')) {            initialQuery = params.get('search');          } else if (params.get('q')) {            initialQuery = params.get('q');          } else if (params.get('query')) {            initialQuery = params.get('query');          }                    this.currentQuery = initialQuery;          if (this.searchInput) {            if (this.getViewMode() === 'savings_squad') {              this.searchInput.value = '';            } else {              this.searchInput.value = this.currentQuery;            }          }                    if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {            this.fetchDeals(this.currentQuery);          } else {            this.render();          }        }        updatePriceDropdownCurrency() {          if (!this.priceFilter || !this.regionSelect) return;          const currencySymbols = {            'US': '$',            'GB': '£',            'CA': '$CA',            'AU': '$AU',            'DE': '€',            'FR': '€',            'IT': '€',          };          const area = this.getAreaCode();          const cur = currencySymbols[area || 'US'] || '$';                    const options = this.priceFilter.options;          for (let i = 0; i < options.length; i++) {            const opt = options[i];            if (opt.value === 'all') {              opt.innerText = 'All Prices';            } else if (opt.value === 'under50') {              opt.innerText = `Under ${cur}50`;            } else if (opt.value === '50_100') {              opt.innerText = `${cur}50 - ${cur}100`;            } else if (opt.value === '100_200') {              opt.innerText = `${cur}100 - ${cur}200`;            } else if (opt.value === '200_500') {              opt.innerText = `${cur}200 - ${cur}500`;            } else if (opt.value === 'over500') {              opt.innerText = `Over ${cur}500`;            }          }        }        populateBrandDropdown(values) {          if (!this.brandDropdown || !this.brandFilterWrapper) return;          this.brandFilterWrapper.style.display = 'flex'; // show the wrapper                    let html = '';          const allChecked = this.selectedBrands.length === 0 ? 'checked' : '';          const _div = '<' + '/div>';          const _span = '<' + '/span>';          html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="" ${allChecked} class="tg-df-brand-chk"> Any Brand${_div}`;                    values.forEach(v => {             if (!v.formatted_value || v.formatted_value === 'Any Brand') return;             const isChecked = this.selectedBrands.includes(v.formatted_value) ? 'checked' : '';             html += `\x3Cdiv class="tg-df-ms-option">\x3Cinput type="checkbox" value="${this.escapeHTML(v.formatted_value)}" ${isChecked} class="tg-df-brand-chk"> ${this.escapeHTML(v.formatted_value)} \x3Cspan style="color:var(--tg-df-text-muted);font-size:12px">(${v.count || 0})${_span}${_div}`;          });                    this.brandDropdown.innerHTML = html;                    // Re-bind listeners          const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');          chks.forEach(chk => {            chk.addEventListener('change', (e) => {              const val = e.target.value;              if (val === '') {                this.selectedBrands = [];              } else {                if (e.target.checked) {                   if (!this.selectedBrands.includes(val)) this.selectedBrands.push(val);                } else {                   this.selectedBrands = this.selectedBrands.filter(b => b !== val);                }              }                            if (this.selectedBrands.length === 0) {                 this.brandTrigger.innerText = 'Any Brand';              } else if (this.selectedBrands.length === 1) {                 this.brandTrigger.innerText = this.selectedBrands[0];              } else {                 this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;              }                            // Only call API if changed from UI interactions              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                 this.updateURLParams();                 this.fetchDeals(this.currentQuery);              }            });          });                    // Update button text on load          if (this.selectedBrands.length === 0) {             this.brandTrigger.innerText = 'Any Brand';          } else if (this.selectedBrands.length === 1) {             this.brandTrigger.innerText = this.selectedBrands[0];          } else {             this.brandTrigger.innerText = `${this.selectedBrands.length} Brands selected`;          }        }        updateURLParams() {          const url = new URL(window.location);          if (this.currentQuery && this.currentQuery !== 'Gaming laptops') {            url.searchParams.set('q', this.currentQuery);          } else {            url.searchParams.delete('q');            url.searchParams.delete('search');            url.searchParams.delete('query');          }                    if (this.regionSelect && this.regionSelect.value !== 'auto') {            url.searchParams.set('region', this.regionSelect.value);          } else {            url.searchParams.delete('region');          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.set('retailer', this.retailerSelect.value);          } else {            url.searchParams.delete('retailer');          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.set('brands', this.selectedBrands.join(','));          } else {            url.searchParams.delete('brands');          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.set('offer_type', this.offerTypeSelect.value);          } else {            url.searchParams.delete('offer_type');          }                    if (this.viewModeSelect && this.viewModeSelect.value !== 'auto') {            url.searchParams.set('view_mode', this.viewModeSelect.value);          } else {            url.searchParams.delete('view_mode');          }                    if (this.rowsSelect && this.rowsSelect.value !== '12') {            url.searchParams.set('rows', this.rowsSelect.value);          } else {            url.searchParams.delete('rows');          }                    const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             url.searchParams.set('price', `${min}_${max}`);          } else if (this.priceFilter && this.priceFilter.value !== 'all') {            url.searchParams.set('price', this.priceFilter.value);          } else {            url.searchParams.delete('price');          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {               const ratio = (100 - v) / 100;               url.searchParams.set('min_discount_ratio', ratio.toString());            }          } else {            url.searchParams.delete('min_discount_ratio');          }                    if (this.sortSelect && this.sortSelect.value !== 'date_desc') {            url.searchParams.set('sort', this.sortSelect.value);          } else {            url.searchParams.delete('sort');          }                    if (this.dealModeToggle && this.dealModeToggle.checked) {            url.searchParams.set('deal_mode', 'true');          } else {            url.searchParams.delete('deal_mode');          }                    window.history.replaceState({}, '', url);        }        bindEvents() {          const handleFiltersScroll = () => {            const filters = this.root.querySelector('.tg-df-filters');            const leftBtn = this.root.querySelector('.tg-df-scroll-btn.left');            const rightBtn = this.root.querySelector('.tg-df-scroll-btn.right');            if (filters && leftBtn && rightBtn) {              const { scrollLeft, scrollWidth, clientWidth } = filters;              leftBtn.style.display = scrollLeft > 0 ? 'flex' : 'none';              rightBtn.style.display = Math.ceil(scrollLeft + clientWidth) < scrollWidth - 5 ? 'flex' : 'none';            }          };          const filters = this.root.querySelector('.tg-df-filters');          if (filters) {            filters.addEventListener('scroll', handleFiltersScroll);            window.addEventListener('resize', handleFiltersScroll);            setTimeout(handleFiltersScroll, 100);                        // Also call after rendering dropdowns            const origRenderCategories = this.renderCategories;            if (origRenderCategories) {               this.renderCategories = (...args) => {                 origRenderCategories.apply(this, args);                 setTimeout(handleFiltersScroll, 50);               };            }          }                const roundels = this.root.querySelectorAll('.tg-df-carousel-cat');          roundels.forEach(r => {             r.addEventListener('click', () => {                const q = r.getAttribute('data-query');                const pr = r.getAttribute('data-pr');                if (typeof trackHawkEvent !== 'undefined') {                     trackHawkEvent({                         clickType: "CC",                         widgetId: this.widgetId,                         productCategoryName: "deals",                         zeroBasedProductIndexOrNull: null,                         totalDealsOrProducts: null,                         areaClicked: "Category Roundel",                         revenueId: this.revenueId,                         isoCurrencyCode: typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD',                         queryName: q,                         widgetTypeName: this.widgetTypeName                     });                 }                this.currentQuery = q;                const label = this.root.querySelector('#tg-df-carousel-title-label');                if (label) label.textContent = 'Best ' + q;                if (this.priceFilter) this.priceFilter.value = pr || 'all';                if (this.discountFilter) this.discountFilter.value = '5';                if (this.searchInput) this.searchInput.value = q;                                roundels.forEach(ro => ro.classList.remove('active'));                r.classList.add('active');                this.fetchDeals(this.currentQuery);             });          });          const discBtns = this.root.querySelectorAll('.tg-df-carousel-filter-btn');          discBtns.forEach(b => {             b.addEventListener('click', () => {                const d = b.getAttribute('data-d');                const pr = b.getAttribute('data-pr');                const ot = b.getAttribute('data-ot');                let label = b.innerText ? b.innerText.trim() : '';                let filterType = 'unknown';                let filterVal = 'unknown';                if (d !== null) { filterType = 'discount'; filterVal = d; }                else if (pr !== null) { filterType = 'price'; filterVal = pr; }                else if (ot !== null) { filterType = 'offertype'; filterVal = ot; }                if (typeof trackElementInteraction === 'function') trackElementInteraction({ id: `filter-${filterType}-${filterVal}`, name: 'Filter Button', label: label });                                if (d !== null) {                   if (this.discountFilter) this.discountFilter.value = this.discountFilter.value === d ? '0' : d;                } else if (pr !== null) {                   if (this.priceFilter) this.priceFilter.value = this.priceFilter.value === pr ? 'all' : pr;                } else if (ot !== null) {                   if (this.offerTypeSelect) this.offerTypeSelect.value = this.offerTypeSelect.value === ot ? 'all' : ot;                } else {                   if (this.discountFilter) this.discountFilter.value = '0';                   if (this.priceFilter) this.priceFilter.value = 'all';                   if (this.offerTypeSelect) this.offerTypeSelect.value = 'all';                }                if (d === null && pr === null && ot === null && b.getAttribute("data-type") !== "custom") {                   discBtns.forEach(ro => ro.classList.remove('active'));                   b.classList.add('active');                } else if (b.getAttribute("data-type") !== "custom") {                   // Only operate on hardcoded buttons (those without data-type)                   discBtns.forEach(ro => {                      if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active');                   });                                      let makeActive = true;                   if (d !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-d') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (pr !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-pr') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   } else if (ot !== null) {                       if (b.classList.contains('active')) makeActive = false;                       discBtns.forEach(ro => { if (ro.getAttribute('data-ot') !== null && ro.getAttribute('data-type') !== 'custom') ro.classList.remove('active') });                   }                                      if (makeActive) b.classList.add('active');                                      // Check if anything is active, if not activate "All"                   let anyActive = false;                   discBtns.forEach(ro => { if (ro.classList.contains('active') && ro.getAttribute('data-type') !== 'custom') anyActive = true; });                   if (!anyActive) {                       discBtns.forEach(ro => { if (!ro.getAttribute('data-d') && !ro.getAttribute('data-pr') && !ro.getAttribute('data-ot') && ro.getAttribute('data-type') !== 'custom') ro.classList.add('active'); });                   }                }                                this.fetchDeals(this.currentQuery);             });          });          if (this.brandTrigger && this.brandDropdown) {            this.brandTrigger.addEventListener('click', () => {              this.brandDropdown.classList.toggle('active');            });            document.addEventListener('click', (e) => {              if (this.brandFilterWrapper && !e.composedPath().includes(this.brandFilterWrapper)) {                this.brandDropdown.classList.remove('active');              }            });          }          const showAutocomplete = () => {             if (this.getViewMode() !== 'savings_squad' || !this.autocompleteDropdown || !this.airedaleTags) return;                          let terms = this.airedaleTags;             if (this.airedaleBrands) {                terms = terms.concat(this.airedaleBrands.map(b => b.formatted_value));             }             terms = [...new Set(terms)];                          const query = this.searchInput.value.trim();             let matches = [];             if (query.length > 0) {                 matches = terms.filter(t => t.toLowerCase().includes(query.toLowerCase()) && t.toLowerCase() !== query.toLowerCase());             } else {                 matches = terms;             }                          if (matches.length > 0) {                 this.autocompleteDropdown.innerHTML = matches.map(m => `\x3Cdiv class="tg-df-autocomplete-item" data-tag="${this.escapeHTML(m)}">${this.escapeHTML(m)}<` + `/div>`).join('');                 this.autocompleteDropdown.classList.add('active');             } else {                 this.autocompleteDropdown.classList.remove('active');             }          };          let debounceTimer;          if(this.searchInput) {            this.searchInput.addEventListener('focus', showAutocomplete);            this.searchInput.addEventListener('input', (e) => {              clearTimeout(debounceTimer);              const query = e.target.value.trim();              this.currentQuery = query;              showAutocomplete();              debounceTimer = setTimeout(() => {                this.updateURLParams();                if (query.length > 2) {                  this.fetchDeals(query);                } else if (query.length === 0) {                  if (this.getViewMode() === 'savings_squad') {                    this.activeDealTag = null;                    this.currentQuery = '';                    if (this.categoryFilter) this.categoryFilter.value = 'all';                    this.fetchDeals('');                  } else {                    this.deals = [];                    this.render();                  }                }              }, 400);            });            this.searchInput.addEventListener('keypress', (e) => {              if (e.key === 'Enter') {                if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');                clearTimeout(debounceTimer);                const query = e.target.value.trim();                this.currentQuery = query;                                let isTag = false;                if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;                if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;                this.activeDealTag = isTag ? query : null;                                trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                this.updateURLParams();                if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                   if (query.length === 0 && this.getViewMode() === 'savings_squad') {                       if (this.categoryFilter) this.categoryFilter.value = 'all';                   }                   this.fetchDeals(query);                }              }            });          }          if (this.autocompleteDropdown) {             this.autocompleteDropdown.addEventListener('click', (e) => {                const item = e.target.closest('.tg-df-autocomplete-item');                if (item) {                   const tag = item.getAttribute('data-tag');                   this.currentQuery = tag;                   if (this.searchInput) this.searchInput.value = tag;                   this.activeDealTag = tag;                   if (this.categoryFilter && this.airedaleTags.includes(tag)) {                       this.categoryFilter.value = tag;                   }                   this.autocompleteDropdown.classList.remove('active');                   this.updateURLParams();                   this.fetchDeals(tag);                }             });             document.addEventListener('click', (e) => {               if (this.autocompleteDropdown && this.searchInput && !e.composedPath().includes(this.searchInput) && !e.composedPath().includes(this.autocompleteDropdown)) {                 this.autocompleteDropdown.classList.remove('active');               }             });          }          if (this.searchBtn) {            this.searchBtn.addEventListener('click', () => {              if (this.autocompleteDropdown) this.autocompleteDropdown.classList.remove('active');              clearTimeout(debounceTimer);              const query = this.searchInput.value.trim();              trackElementInteraction({ id: 'search-submit', name: 'Ask', label: 'Ask (main search)', text: query });                            let isTag = false;              if (this.airedaleTags && this.airedaleTags.includes(query)) isTag = true;              if (this.airedaleBrands && this.airedaleBrands.some(b => b.formatted_value === query)) isTag = true;              this.activeDealTag = isTag ? query : null;                            this.currentQuery = query;              this.updateURLParams();              if (query.length > 2 || (this.getViewMode() === 'savings_squad')) {                 if (query.length === 0 && this.getViewMode() === 'savings_squad') {                     if (this.categoryFilter) this.categoryFilter.value = 'all';                 }                 this.fetchDeals(query);              }            });          }          if(this.sortSelect && this.sortSelect.querySelector('option[value="date_desc"]') === null) {              const option = document.createElement('option');              option.value = "date_desc";              option.text = "Newest First";              this.sortSelect.insertBefore(option, this.sortSelect.firstChild);          }          if(this.sortSelect) this.sortSelect.addEventListener('change', () => {            trackElementInteraction({ id: `sort-option-${this.sortSelect.value}`, name: 'Sort', label: `Sort: ${this.sortSelect.options[this.sortSelect.selectedIndex].text}` });            this.updateURLParams();            if (this.deals.length > 0) {              this.sortData();              this.render();            }          });                    const priceFilter = this.root.querySelector('#tg-df-price-filter');          if (priceFilter) {            this.priceFilter = priceFilter;            this.priceFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-price-${this.priceFilter.value}`, name: 'Price', label: this.priceFilter.options[this.priceFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          const updateCustomPrice = () => {             this.updateURLParams();             if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);             } else {                this.render();             }          };          if (this.customPriceMin) {             this.customPriceMin.addEventListener('change', updateCustomPrice);             this.customPriceMin.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          if (this.customPriceMax) {             this.customPriceMax.addEventListener('change', updateCustomPrice);             this.customPriceMax.addEventListener('keypress', (e) => {                if (e.key === 'Enter') updateCustomPrice();             });          }          const discountFilter = this.root.querySelector('#tg-df-discount-filter');          if (discountFilter) {            this.discountFilter = discountFilter;            this.discountFilter.addEventListener('change', () => {              trackElementInteraction({ id: `filter-discount-${this.discountFilter.value}`, name: 'Discount', label: this.discountFilter.options[this.discountFilter.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }            });          }          if (this.categoryFilter) {            this.categoryFilter.addEventListener('change', (e) => {               const val = e.target.value === 'all' ? null : e.target.value;               this.activeDealTag = val;               if (val) {                 this.currentQuery = val;               } else {                 if (this.searchInput && this.currentQuery === document.querySelector('#tg-df-brand-trigger')?.getAttribute('data-active-brand')) {                     // don't clear current query if a brand is selected                 } else if (this.searchInput) {                     this.currentQuery = '';                     this.searchInput.value = '';                 }               }               this.fetchSavingsSquad();            });          }                    if (this.settingsToggle) {            this.settingsToggle.addEventListener('click', () => {              const o = this.settingsPanel.classList.toggle('active');              this.settingsBackdrop.classList.toggle('active');              if (o) trackElementInteraction({ id: 'filter-open', name: 'Filters', label: 'Open filters' });            });          }                    if (this.settingsBackdrop) {            this.settingsBackdrop.addEventListener('click', () => {              this.settingsPanel.classList.remove('active');              this.settingsBackdrop.classList.remove('active');            });          }                    if (this.regionSelect) {            this.regionSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-region-${this.regionSelect.value}`, name: 'Region', label: this.regionSelect.options[this.regionSelect.selectedIndex].text });              this.updateURLParams();              this.updatePriceDropdownCurrency();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.retailerSelect) {            this.retailerSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-merchant-${this.retailerSelect.value}`, name: 'Retailer', label: this.retailerSelect.options[this.retailerSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.offerTypeSelect) {            this.offerTypeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-offertype-${this.offerTypeSelect.value}`, name: 'Offer Type', label: this.offerTypeSelect.options[this.offerTypeSelect.selectedIndex].text });              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.viewModeSelect) {            this._prevViewMode = this.viewModeSelect.value;            this.viewModeSelect.addEventListener('change', () => {              trackElementInteraction({ id: `filter-viewmode-${this.viewModeSelect.value}`, name: 'View Mode', label: this.viewModeSelect.options[this.viewModeSelect.selectedIndex].text });                            // Reset all active toggles and filters to prevent config carry-over              this.selectedBrands = [];              if (this.brandTrigger) this.brandTrigger.innerText = 'Select Brands';              if (this.brandDropdown) {                const chks = this.brandDropdown.querySelectorAll('.tg-df-brand-chk');                chks.forEach(chk => { chk.checked = false; });              }              if (this.priceFilter) this.priceFilter.value = 'all';              if (this.customPriceMin) this.customPriceMin.value = '';              if (this.customPriceMax) this.customPriceMax.value = '';              if (this.sortSelect) this.sortSelect.value = 'date_desc';              if (this.discountFilter) this.discountFilter.value = '0';              if (this.retailerSelect) this.retailerSelect.value = '';              if (this.offerTypeSelect) this.offerTypeSelect.value = '';              if (this.rowsSelect) this.rowsSelect.value = '12';              if (this.categoryFilter) this.categoryFilter.value = 'all';              this.activeDealTag = null;              this.updateURLParams();              this.applyLayoutMode();                            if (this.getViewMode() === 'savings_squad' || this._prevViewMode === 'savings_squad') {                this.fetchDeals(this.currentQuery);              } else {                this.render();              }              this._prevViewMode = this.viewModeSelect.value;            });          }                    if (this.rowsSelect) {            this.rowsSelect.addEventListener('change', () => {              this.updateURLParams();              if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {                this.fetchDeals(this.currentQuery);              }            });          }                    if (this.dealModeToggle) {            this.dealModeToggle.addEventListener('change', () => {              this.updateURLParams();              this.render();            });          }          if (this.editorModeToggle) {             this.editorModeToggle.addEventListener('change', (e) => {                this.editorMode = e.target.checked;                this.render();                this.updateFloatingCopyBar();             });          }          if (this.editorCopyBtn) {             this.editorCopyBtn.addEventListener('click', () => {                this.copySelectedDealsToCMS();             });          }          if (this.editorClearBtn) {             this.editorClearBtn.addEventListener('click', () => {                this.selectedDeals.clear();                this.render();                this.updateFloatingCopyBar();             });          }          if (this.grid) {            this.grid.addEventListener('change', (e) => {               if (e.target.classList.contains('tg-df-deal-checkbox')) {                  const dealId = e.target.getAttribute('data-id');                  if (e.target.checked) {                     const dealObj = this.deals.find(d => d.id === dealId);                     if (dealObj) this.selectedDeals.set(dealId, dealObj);                  } else {                     this.selectedDeals.delete(dealId);                  }                  this.updateFloatingCopyBar();               }            });            this.grid.addEventListener('click', (e) => {              const dealCard = e.target.closest('[data-action="deal-click"]');              const similarCard = e.target.closest('[data-action="view-similar-click"]');              const cardLink = dealCard || similarCard;              if (cardLink) {                const productName = cardLink.getAttribute('data-product-name');                const merchantName = cardLink.getAttribute('data-merchant-name');                const productId = cardLink.getAttribute('data-analytics-id');                const price = parseFloat(cardLink.getAttribute('data-price')) || null;                const prevPriceStr = cardLink.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = cardLink.getAttribute('data-original-link');                const rewrittenLink = cardLink.getAttribute('href');                const revenueId = cardLink.getAttribute('data-revenue-id');                const index = parseInt(cardLink.getAttribute('data-index'), 10) || 0;                const inStock = cardLink.getAttribute('data-in-stock') === 'true';                const totalText = cardLink.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: cardLink.getAttribute('data-model-id') || null,                    matchId: cardLink.getAttribute('data-match-id') || null,                    brand: cardLink.getAttribute('data-model-brand') || null,                    parent: cardLink.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: cardLink.getAttribute('data-merchant-id') || null,                    network: cardLink.getAttribute('data-merchant-network') || null,                    url: cardLink.getAttribute('data-merchant-url') || null,                    name: merchantName                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: normalizeCurrency(this.escapeHTML(cardLink.getAttribute('data-currency') || '$'))                };                if (dealCard) {                  trackDealClick(trackingParams);                } else {                  trackViewSimilarClick(trackingParams);                }              }              const couponsBtn = e.target.closest('[data-action="coupons-click"]');              if (couponsBtn) {                trackElementInteraction({                  id: 'product-card-show-coupons',                  name: 'Coupons',                  label: `Product card coupons: ${couponsBtn.getAttribute('data-merchant')}`                });              }            });          }          this.setupScrollListeners();        }        setupScrollListeners() {          const containers = [             this.root.querySelector('.tg-df-carousel-roundels'),             this.root.querySelector('.tg-df-carousel-filters-wrap'),             this.root.querySelector('#tg-df-grid')          ];                    containers.forEach(container => {             if (!container) return;                          const checkScroll = () => {                if (!container.parentElement) return;                const leftBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-left');                const rightBtn = container.parentElement.querySelector('.tg-df-carousel-scroll-right');                                if (leftBtn) {                   if (container.scrollLeft <= 5) leftBtn.style.display = 'none';                   else leftBtn.style.display = 'flex';                }                                if (rightBtn) {                   if (container.scrollWidth <= container.clientWidth) {                       rightBtn.style.display = 'none';                   } else if (container.scrollLeft >= container.scrollWidth - container.clientWidth - 5) {                       rightBtn.style.display = 'none';                   } else {                       rightBtn.style.display = 'flex';                   }                }             };                          container.addEventListener('scroll', checkScroll);             checkScroll();                          window.addEventListener('resize', checkScroll);                          const observer = new MutationObserver(checkScroll);             observer.observe(container, { childList: true, subtree: true, characterData: false });          });        }        get widgetTypeName() {          const mode = this.viewModeSelect ? this.viewModeSelect.value : (this.viewModeOverride || 'auto');          switch(mode) {              case 'carousel': return 'Carousel';              case 'savings_squad': return 'Savings Squad';              case 'grid': return 'Grid';              case 'row': return 'Row';              default: return 'Auto Collection';          }        }        getRowsLimit() {          if (this.rowsSelect && this.rowsSelect.value) return parseInt(this.rowsSelect.value, 10);          let configSource = window.location.search;          if (this.hostContainer && this.hostContainer.hasAttribute('data-widget-config')) {             configSource = this.hostContainer.getAttribute('data-widget-config');          } else if (typeof window !== 'undefined' && window.__WIDGET_CONFIG__) {             configSource = window.__WIDGET_CONFIG__;          }          const params = new URLSearchParams(configSource);          if (params.has('rows')) return parseInt(params.get('rows'), 10) || 12;          return 12;        }        getAreaCode() {          if (this.regionSelect && this.regionSelect.value) {            if (this.regionSelect.value === 'auto') return null;            return this.regionSelect.value;          }          let area = null;          try {            const locale = window.navigator.language || window.navigator.userLanguage;            if (locale && locale.includes('-')) {              area = locale.split('-')[1].toUpperCase();            } else if (locale && locale.length === 2) {              if (locale.toUpperCase() === 'EN') { area = 'US'; }              else { area = locale.toUpperCase(); }            }          } catch (e) { /* Ignore */ }                    // Map to known valid options or fallback to US          const valid = ['US', 'GB', 'CA', 'AU', 'DE', 'FR', 'IT'];          if (area === 'UK') area = 'GB';          if (valid.includes(area)) {             return area;          }          return 'US';        }        async fetchDeals(query) {          this.showLoading();          this.deals = [];          this.displayLimit = this.getRowsLimit();                    try {            console.log("getViewMode returns:", this.getViewMode());            if (this.getViewMode() === 'savings_squad') {               await this.fetchSavingsSquad();            } else {               if (this.isBroadQuery(query)) {                 await this.fetchAdviserDeals(query);               } else {                 await this.fetchHawkDeals(query);                 if (this.deals.length === 0) {                   await this.fetchAdviserDeals(query);                 }               }            }          } catch (error) {            console.warn("[Tom's Guide Widget] Fetch error:", error);            this.showError();          }        }        async fetchSavingsSquad() {          let topArticles = this.airedaleArticles;          if (!topArticles) {            const siteParam = this.website || 'tomsguide';            const airedaleUrl = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50`;            let res;            try {               res = await fetch(airedaleUrl);            } catch(e) {               try { res = await fetch(`https://airedale.futurecdn.net/feeds/feed_1776420579726.json?site=${siteParam}&articleType=deals&limit=50`); } catch (err) { console.warn("Fallback fetch failed", err); return; }            }            if (!res.ok) throw new Error('Airedale API Error');            const articles = await res.json();            topArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);            this.airedaleArticles = topArticles;                        let tagCounts = {};            topArticles.forEach((a) => {              let articleTags = new Set();              if (a.articlecategory && Array.isArray(a.articlecategory)) {                 a.articlecategory.forEach((t) => articleTags.add(t));              }              articleTags.forEach(t => {                 tagCounts[t] = (tagCounts[t] || 0) + 1;              });            });                        this.airedaleTags = Object.keys(tagCounts).sort((a, b) => tagCounts[b] - tagCounts[a]);            this.airedaleTagCounts = tagCounts;          }                    let targetArticles = topArticles;          if (!this.activeDealTag && this.currentQuery) {             const tagMatch = this.airedaleTags.find(t => t.toLowerCase() === this.currentQuery.toLowerCase());             if (tagMatch) {                this.activeDealTag = tagMatch;             }          }          if (this.activeDealTag) {             const cleanTag = this.activeDealTag.toLowerCase().replace(/&/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');             const encodedTag = encodeURIComponent(cleanTag);             const siteParam = this.website || 'tomsguide';             const url = `https://airedale.futurecdn.net/feeds/feed_1781000519267.json?site=${siteParam}&articleType=deals&limit=50&articleCategoryHandle=${encodedTag}`;             try {                const res = await fetch(url);                if (res.ok) {                   const articles = await res.json();                   targetArticles = Array.isArray(articles) ? articles.slice(0, 50) : ((articles.data && Array.isArray(articles.data)) ? articles.data.slice(0, 50) : []);                }             } catch(e) {                console.warn("Failed to fetch by activeDealTag", e);             }          }          let extractedDeals = [];          let seenUrls = new Set();                    let overallBrandsCounts = {};                    // First pass: extract ALL brands from topArticles so the dropdown has all options          topArticles.forEach((article) => {             if (!article.articlepage) return;             let pageData = [];             try { pageData = JSON.parse(article.articlepage[0]); } catch(e){ console.warn(e); }             const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');             savingsSquad.forEach((block) => {                const data = block.data || {};                if (data.brand) {                   const cleanBrand = data.brand.replace(/^\d+\.\s*/, '').trim();                   overallBrandsCounts[cleanBrand] = (overallBrandsCounts[cleanBrand] || 0) + 1;                }             });          });          targetArticles.forEach((article) => {             if (!article.articlepage) return;                          let pageData = [];             try {                pageData = JSON.parse(article.articlepage[0]);             } catch(e){ console.warn(e); }                          const savingsSquad = pageData.filter((p) => p.type === 'deal' || p.type === 'featured-product');                          savingsSquad.forEach((block, idx) => {                const data = block.data || {};                const isFeatured = block.type === 'featured-product';                                const link = data.link || {};                const priceObj = data.price || {};                const image = data.image || {};                                if (data.brand) {                   data.brand = data.brand.replace(/^\d+\.\s*/, '').trim();                }                const externalUrl = isFeatured ? data.url : (link.href || null);                let summaryTitle = isFeatured ? (data.name || data.brand) : (data.productName || link.label || article.articlename);                let description = isFeatured ? (data.strapline || '') : (data.text || '');                                if (!isFeatured && !data.productName && data.text) {                   const brSplit = data.text.split(new RegExp('\x3Cbr\\s*\\/?\\x3E', 'i'));                   if (brSplit.length > 1) {                     summaryTitle = brSplit[0].replace(/<[^>]+>/g, '').trim();                     description = brSplit.slice(1).join(' ').replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();                   } else {                     const match = data.text.match(/\x3Cstrong>(.*?)<\/strong>/);                     if (match) {                       summaryTitle = match[1].replace(/<[^>]+>/g, '').trim();                       if (summaryTitle.endsWith(':')) summaryTitle = summaryTitle.slice(0, -1);                     }                   }                }                                let imageUrl = isFeatured ? image.mos : (image.src || null);                if (imageUrl && imageUrl.startsWith('//')) imageUrl = 'https:' + imageUrl;                                description = description.replace(/<br\s*\/?>/gi, ' ').replace(/<\/?(p|div)[^>]*>/gi, ' ').replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').replace(/View Deal$/i, '').trim();                                let merchantName = data.retailer || '';                if (!merchantName && externalUrl) {                   try {                     merchantName = new URL(externalUrl).hostname.replace('www.', '').split('.')[0];                     merchantName = merchantName.charAt(0).toUpperCase() + merchantName.slice(1);                   }catch(e){ console.warn(e); }                }                if (!merchantName) merchantName = 'Retailer';                const q = (this.currentQuery || '').toLowerCase();                const activeTagLogic = (this.activeDealTag || '').toLowerCase();                if (q.length > 2 && q !== activeTagLogic) {                   const searchTarget = `${summaryTitle || ''} ${description || ''}`.toLowerCase();                   if (!searchTarget.includes(q)) return;                }                let rawPrice = 0;                let rawMsrp = 0;                let currencyStr = '$';                if (isFeatured) {                   rawPrice = typeof data.salePrice === 'number' && data.salePrice > 0 ? data.salePrice : (typeof data.price === 'number' ? data.price : 0);                   rawMsrp = typeof data.salePrice === 'number' && typeof data.price === 'number' && data.price > data.salePrice ? data.price : 0;                   currencyStr = data.currency === 'GBP' ? '£' : '$';                } else {                   rawPrice = priceObj.amount ? parseFloat(priceObj.amount) : 0;                   rawMsrp = priceObj.amountWas ? parseFloat(priceObj.amountWas) : 0;                   currencyStr = priceObj.currency === 'GBP' ? '£' : '$';                }                                let savingAmt = 0;                let savingLabel = '';                if (rawPrice > 0 && rawMsrp > rawPrice) {                   savingAmt = parseFloat((rawMsrp - rawPrice).toFixed(2));                   savingLabel = `Save ${currencyStr}${savingAmt}`;                }                                // Apply Brand filter                if (this.selectedBrands && this.selectedBrands.length > 0) {                   const itemBrand = (data.brand || '').toLowerCase();                   const hasMatch = this.selectedBrands.some(sb => sb.toLowerCase() === itemBrand);                   if (!hasMatch) return;                }                // Apply Price filter                let priceFilterVal = null;                const min = this.customPriceMin ? this.customPriceMin.value : '';                const max = this.customPriceMax ? this.customPriceMax.value : '';                if (min || max) {                   priceFilterVal = `${min}_${max}`;                } else if (this.priceFilter && this.priceFilter.value !== 'all') {                   priceFilterVal = this.priceFilter.value;                }                if (priceFilterVal && rawPrice > 0) {                   if (priceFilterVal === 'under50' && rawPrice >= 50) return;                   if (priceFilterVal === 'over50' && rawPrice <= 50) return;                   if (priceFilterVal === 'over30' && rawPrice <= 30) return;                   if (priceFilterVal === 'over500' && rawPrice <= 500) return;                   if (priceFilterVal.includes('_')) {                      const parts = priceFilterVal.split('_');                      const min = parseFloat(parts[0]);                      const max = parseFloat(parts[1]);                      if (!isNaN(min) && rawPrice < min) return;                      if (!isNaN(max) && rawPrice > max) return;                   }                }                // Apply Discount filter                if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {                   const requiredDiscount = parseInt(this.discountFilter.value);                   if (!isNaN(requiredDiscount) && requiredDiscount > 0) {                      if (!rawMsrp || rawMsrp <= rawPrice) return;                      const ratio = Math.round((1 - (rawPrice / rawMsrp)) * 100);                      if (ratio < requiredDiscount) return;                   }                }                                if (externalUrl) {                   if (seenUrls.has(externalUrl)) return;                  seenUrls.add(externalUrl);                }                                extractedDeals.push({                   id: `airedale-${article.id || Math.random()}-${idx}`,                   url: externalUrl,                   image: imageUrl,                   fallbackImage: imageUrl,                   title: summaryTitle,                   brand: data.brand || '',                   productName: data.productName || '',                   merchant: merchantName,                   rawPrice: rawPrice,                   rawMsrp: rawMsrp,                   price: rawPrice > 0 ? rawPrice.toString() : '',                   msrp: rawMsrp > 0 ? rawMsrp.toString() : '',                   currency: currencyStr,                   isCheckPrice: !rawPrice,                   savingLabel: savingLabel,                   savingType: rawMsrp > rawPrice ? 'amount' : 'none',                   isPrime: false,                   starRating: null,                   description: description,                   text: data.text || '',                   authorName: article.articleauthortext ? article.articleauthortext[0] : (article.articleauthor ? article.articleauthor[0] : ''),                   authorRole: article.articleauthorrole ? article.articleauthorrole[0] : '',                   authorImage: article.articleauthormedia ? article.articleauthormedia[0] : '',                   documentUrl: article.documenturl ? article.documenturl[0] : '',                   modifiedDate: article.contentmodifieddate || article.modifieddate || ''                });             });          });                    const airedaleBrandsList = Object.keys(overallBrandsCounts).map(b => ({              formatted_value: b,              count: overallBrandsCounts[b]          })).sort((a,b) => b.count - a.count);                    if (this.getViewMode() === 'savings_squad') {             this.populateBrandDropdown(airedaleBrandsList.slice(0, 15));             if (this.brandFilterWrapper) {                if (airedaleBrandsList.length === 0) {                    this.brandFilterWrapper.style.display = 'none';                } else {                    this.brandFilterWrapper.style.display = 'flex';                }             }          }                    this.deals = extractedDeals;          this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        isBroadQuery(query) {          const q = query.toLowerCase();          const intentModifiers = ['deals', 'best', 'sale', 'under', 'cheap', 'offers', 'discount'];          return intentModifiers.some(term => q.includes(term));        }        async fetchHawkDeals(query) {          const url = new URL(this.apiUrl);          url.searchParams.append('model_name', query);          const areaCode = this.getAreaCode();          if (areaCode) {            url.searchParams.append('area', areaCode);          }                    if (this.retailerSelect && this.retailerSelect.value) {            url.searchParams.append('filter_merchant_name', this.retailerSelect.value);          }                    if (this.selectedBrands && this.selectedBrands.length > 0) {            url.searchParams.append('filter_label[text_brand]', this.selectedBrands.join(','));          }                    let priceVal = null;          const min = this.customPriceMin ? this.customPriceMin.value : '';          const max = this.customPriceMax ? this.customPriceMax.value : '';          if (min || max) {             priceVal = `${min}_${max}`;          } else if (this.priceFilter && this.priceFilter.value !== 'all') {             priceVal = this.priceFilter.value;          }          if (priceVal) {            if (priceVal === 'under50') {              url.searchParams.append('filter_max_price', '50');            } else if (priceVal === 'over50') {              url.searchParams.append('filter_min_price', '50');            } else if (priceVal === 'over30') {              url.searchParams.append('filter_min_price', '30');            } else if (priceVal === 'over500') {              url.searchParams.append('filter_min_price', '500');            } else if (priceVal.includes('_')) {              const parts = priceVal.split('_');              if (parts[0]) url.searchParams.append('filter_min_price', parts[0]);              if (parts[1]) url.searchParams.append('filter_max_price', parts[1]);            }          }                    if (this.discountFilter && this.discountFilter.value !== 'all' && this.discountFilter.value !== '0') {            const v = parseInt(this.discountFilter.value);            if (!isNaN(v) && v > 0) {              const ratio = (100 - v) / 100;              url.searchParams.append('min_discount_ratio', ratio.toString());            }          }                    if (this.offerTypeSelect && this.offerTypeSelect.value) {            url.searchParams.append('offer', this.offerTypeSelect.value);          }                    url.searchParams.append('filter_product_types', 'deals');                    url.searchParams.append('rows', this.getRowsLimit().toString());          let response;          try {             response = await fetch(url.toString());          } catch(e) {             if (window.location.protocol === 'file:') {                console.warn("[Tom's Guide Widget] fetch from file:// blocked by local CORS policy, falling back to Adviser mock.");                await this.fetchAdviserDeals(query);                return;             }             console.warn("Hawk fetch failed", e);             this.deals = [];             this.render();             return;          }          if (!response.ok) {            throw new Error('Hawk API Response Error');          }          const rawData = await response.json();          // Safely locate data array from potentially wrapped response          let offers = [];          let modelInfoArray = [];                    let brandFilterData = null;          if (rawData && rawData.widget && rawData.widget.data && Array.isArray(rawData.widget.data.filters)) {             brandFilterData = rawData.widget.data.filters.find(f => f.type === 'label_text_brand');          } else if (rawData && rawData.data && Array.isArray(rawData.data.filters)) {             brandFilterData = rawData.data.filters.find(f => f.type === 'label_text_brand');          }          if (brandFilterData && Array.isArray(brandFilterData.values) && brandFilterData.values.length > 0) {             this.populateBrandDropdown(brandFilterData.values);          } else {             if (this.brandFilterWrapper && this.selectedBrands.length === 0) {                this.brandFilterWrapper.style.display = 'none';             }          }                    if (rawData && rawData.widget && rawData.widget.data) {            if (Array.isArray(rawData.widget.data.offers)) offers = rawData.widget.data.offers;            if (rawData.widget.data.model_info && typeof rawData.widget.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.widget.data.model_info) ? rawData.widget.data.model_info : Object.values(rawData.widget.data.model_info);            }          } else if (rawData && rawData.data) {            if (Array.isArray(rawData.data.offers)) offers = rawData.data.offers;            if (rawData.data.model_info && typeof rawData.data.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.data.model_info) ? rawData.data.model_info : Object.values(rawData.data.model_info);            }          } else {            if (Array.isArray(rawData)) offers = rawData;            else if (rawData && Array.isArray(rawData.offers)) offers = rawData.offers;            else if (rawData && rawData.offers && Array.isArray(rawData.offers.offer)) offers = rawData.offers.offer;            else if (rawData && rawData.offers) offers = [].concat(rawData.offers);                        if (rawData && rawData.model_info && typeof rawData.model_info === 'object') {              modelInfoArray = Array.isArray(rawData.model_info) ? rawData.model_info : Object.values(rawData.model_info);            }          }          let modelDetails = {};          modelInfoArray.forEach(m => {            const mId = m.model_id || m.id;            if (mId) {              modelDetails[mId] = {                score: m.score != null ? parseFloat(m.score) : null,                brand: m.brand || null,                parent: (m.parents && Array.isArray(m.parents) && m.parents.length > 0) ? m.parents[0].name : null              };            }          });          offers.forEach(item => {            let data = { ...item };            const mId = data.model_id;            if (mId && modelDetails[mId]) {              data.review_score = modelDetails[mId].score;              data.model_brand = modelDetails[mId].brand;              data.model_parent = modelDetails[mId].parent;            } else {              data.review_score = null;            }                        let itemOffers = [];            if (Array.isArray(item.offers)) itemOffers = item.offers;            else if (Array.isArray(item.offer)) itemOffers = item.offer;            else if (item.offers && typeof item.offers === 'object') itemOffers = [item.offers];            else if (item.offer && typeof item.offer === 'object') itemOffers = [item.offer];            if (itemOffers.length > 0) {              itemOffers.forEach(subItem => {                let subData = { ...item, ...subItem };                const subId = subData.model_id;                if (subId && modelDetails[subId]) {                  subData.review_score = modelDetails[subId].score;                  subData.model_brand = modelDetails[subId].brand;                  subData.model_parent = modelDetails[subId].parent;                } else if (data.review_score != null) {                  subData.review_score = data.review_score;                }                if (subData.merchant && typeof subData.merchant === 'object') {                  subData.merchant_name = subData.merchant.name;                }                this.deals.push(this.extractDealData(subData));              });              return;            }                        if (item.merchant && typeof item.merchant === 'object') {              data.merchant_name = item.merchant.name;            }                        this.deals.push(this.extractDealData(data));          });                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        async fetchAdviserDeals(query) {          // ======================================================================          // TODO: ADVISER API REPLACEMENT          // The code below simulates the Adviser API response using mock data.          // Once the real endpoint is ready, remove getAdviserMockData() and           // perform an actual fetch() request similar to fetchHawkDeals().          // Example:          // const area = this.getAreaCode();          // let apiUrl = `https://your-adviser-api.com/search?q=${query}&area=${area}`;          // if (this.priceFilter && this.priceFilter.value !== 'all') {          //   const val = this.priceFilter.value;          //   if (val === 'under50') apiUrl += '&filter_max_price=50';          //   else if (val === '50_100') apiUrl += '&filter_max_price=100';          //   else if (val === '100_200') apiUrl += '&filter_max_price=200';          //   else if (val === '200_500') apiUrl += '&filter_max_price=500';          // }          // const res = await fetch(apiUrl);          // const rawData = await res.json();          // ======================================================================          // Simulating network latency          await new Promise(resolve => setTimeout(resolve, 400));                    const rawData = this.getAdviserMockData();          let offers = [];                    if (rawData && rawData.data && rawData.data.Get && Array.isArray(rawData.data.Get.Deal)) {            offers = rawData.data.Get.Deal;          }                    // Basic client-side filtering for the mock if we want it to react to the query          const q = query.toLowerCase();          const selectedRetailer = (this.retailerSelect && this.retailerSelect.value) ? this.retailerSelect.value.toLowerCase() : null;                    offers.forEach(item => {            const dataObj = item;                        // Apply retailer filter            const itemRetailer = (dataObj.dataRetailer || '').toLowerCase();            if (selectedRetailer && itemRetailer !== selectedRetailer && !itemRetailer.includes(selectedRetailer)) {              return;            }                        // Apply mock price filter            let price = dataObj.dataDiscountedPrice || 0;            if (typeof price === 'string') {              price = parseFloat(price.replace(/[^0-9.]/g, ''));            }            let priceVal = null;            const min = this.customPriceMin ? this.customPriceMin.value : '';            const max = this.customPriceMax ? this.customPriceMax.value : '';            if (min || max) {               priceVal = `${min}_${max}`;            } else if (this.priceFilter && this.priceFilter.value !== 'all') {               priceVal = this.priceFilter.value;            }            if (priceVal) {              if (priceVal === 'under50' && price >= 50) return;              if (priceVal === 'over50' && price <= 50) return;              if (priceVal === 'over30' && price <= 30) return;              if (priceVal === 'over500' && price <= 500) return;              if (priceVal.includes('_')) {                 const parts = priceVal.split('_');                 if (parts[0] && price < parseFloat(parts[0])) return;                 if (parts[1] && price > parseFloat(parts[1])) return;              }            }                        // Map Adviser schema to our widget's expected schema            const mappedData = {              url: dataObj.linkHREF || dataObj.dataLink || '#',              image: dataObj.imageURL || (dataObj.image && dataObj.image.src) || '',              title: dataObj.dataProduct || (dataObj.product && dataObj.product.name) || 'Product Deal',              merchant: dataObj.dataRetailer || 'Retailer',              price: dataObj.dataDiscountedPrice || 0,              currency: dataObj.dataCurrency === 'USD' ? '$' : (dataObj.dataCurrency || '$'),              msrp: dataObj.dataOriginalPrice || null            };                        const titleLow = mappedData.title.toLowerCase();            const merchLow = mappedData.merchant.toLowerCase();                        // Smarter mock filtering            let isMatch = false;            if (q === '' || this.isBroadQuery(q)) {              isMatch = true;            } else if (titleLow.includes(q) || merchLow.includes(q)) {              isMatch = true;            } else if ((q.includes('laptop') || q.includes('mac') || q.includes('pc')) && (titleLow.includes('macbook') || titleLow.includes('laptop'))) {              isMatch = true;            } else if ((q.includes('tv') || q.includes('television')) && (titleLow.includes('tv') || titleLow.includes('oled') || titleLow.includes('qled'))) {              isMatch = true;            } else if ((q.includes('phone') || q.includes('smartphone')) && (titleLow.includes('galaxy') || titleLow.includes('phone'))) {              isMatch = true;            } else if ((q.match(/watch|fitness|run|shoe/)) && (titleLow.includes('forerunner') || titleLow.includes('saucony') || titleLow.includes('watch'))) {              isMatch = true;            }                        if (isMatch) {               this.deals.push(this.extractDealData(mappedData));            }          });                    let rowLimit = this.getRowsLimit();          // Intentionally omitting the slice here to allow "Load More" to work if the API returns more                    this.sortData();          this.render();          if (typeof trackDealsAppeared !== 'undefined') {             trackDealsAppeared(this.widgetId, this.deals, this.revenueId, typeof this.getAreaCode === 'function' ? (this.getAreaCode() === 'GB' ? 'GBP' : 'USD') : 'USD', this.currentQuery, this.widgetTypeName);          }        }        getAdviserMockData() {          return {            "data": {              "Get": {                "Deal": [                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 300,                    "dataOriginalPrice": 399,                    "dataProduct": "Samsung Galaxy A36",                    "dataRetailer": "Samsung",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/MqDYsukV3JBG54te6dEs7j.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 14,                    "dataOriginalPrice": 24,                    "dataProduct": "Blink Mini",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/3JurmAjHsDa5tPdaHAwEV8.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 59,                    "dataOriginalPrice": 99,                    "dataProduct": "Ring Video Doorbell",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/rAh4uR7AsAsALCCLTXnLNJ.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 10,                    "dataOriginalPrice": 599,                    "dataProduct": "MacBook Neo",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/Lg4Dvg68j9SbB5CPNrTEpH.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 749,                    "dataOriginalPrice": 849,                    "dataProduct": "65\\\" Fire TV Omni 4K QLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/SG34ZWodUkLTxJvMTbjPYR.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 71,                    "dataOriginalPrice": 160,                    "dataProduct": "Saucony Hurricane 24",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/vxf7UD5T2Am7guVzFoFcZ4.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 649,                    "dataOriginalPrice": 749,                    "dataProduct": "Garmin Forerunner 970",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/3GKnEu7CdhtxPMfnPCMCiA.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1049,                    "dataOriginalPrice": 1499,                    "dataProduct": "LG 48\\\" C4 4K OLED TV",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/imvwZV9zoMD6fn9Afuge35.jpg"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 1499,                    "dataOriginalPrice": 2199,                    "dataProduct": "Samsung 49\\\" Odyssey Neo G9 4K Gaming Monitor",                    "dataRetailer": "Amazon",                    "imageURL": "http://cdn.mos.cms.futurecdn.net/XWDEJ5dUAE2nhK8k3Jk7k7.png"                  },                  {                    "dataCurrency": "USD",                    "dataDiscountedPrice": 299,                    "dataOriginalPrice": 699,                    "dataProduct": "EGOHOME Black Memory Foam Mattress (queen)",                    "dataRetailer": "Amazon",                    "imageURL": "https://cdn.mos.cms.futurecdn.net/hMUemtAejNETLVYxNrktzm.jpg"                  }                ]              }            }          };        }        decodeHTML(html) {          if (!html) return '';          const txt = document.createElement("textarea");          txt.innerHTML = String(html);          return txt.value;        }        extractDealData(item) {          const priceRawStr = String(item.price || item.current_price || '0');          const msrpRawStr = String(item.was_price || item.msrp || item.original_price || '0');          const rawPrice = parseFloat(priceRawStr.replace(/[^\d.]/g, '')) || 0;          const rawMsrp = parseFloat(msrpRawStr.replace(/[^\d.]/g, '')) || 0;          const isCheckPrice = rawPrice === 0 || priceRawStr === '0.00' || priceRawStr === '0';                    let originalImageUrl = item.image || item.image_url || item.product_image || '';          let imageUrl = originalImageUrl;          if ((!imageUrl || isCheckPrice) && item.model_image_url) {             imageUrl = item.model_image_url;             originalImageUrl = imageUrl;          } else if ((!imageUrl || isCheckPrice) && item.model_image) {             imageUrl = item.model_image;             originalImageUrl = imageUrl;          }                    if (imageUrl) {            imageUrl = imageUrl.replace(/-(\d+)-(\d+)(\.[a-z.]+)$/i, '$3');          }                    let fallbackImage = '';          if (originalImageUrl && originalImageUrl !== imageUrl) {             fallbackImage = originalImageUrl;          } else if (item.model_image && item.model_image !== imageUrl) {             fallbackImage = item.model_image;          } else if (item.model_image_url && item.model_image_url !== imageUrl) {             fallbackImage = item.model_image_url;          }                    const rawCurrency = item.currency || item.currency_symbol || '$';                    let savingLabel = item.percentage_saving_label || '';          if (!savingLabel && rawMsrp > rawPrice && rawPrice > 0) {            const pct = Math.round(((rawMsrp - rawPrice) / rawMsrp) * 100);            if (pct > 0) {              savingLabel = `${pct}% OFF`;            }          }                    const isPrime = item.shipping && item.shipping.prime === true;                    let scoreRaw = (item.review_score !== undefined && item.review_score !== null && item.review_score > 0) ? parseFloat(item.review_score) : null;          let starRating = 0;          if (scoreRaw !== null) {            starRating = Math.round((scoreRaw > 10 ? scoreRaw / 20 : scoreRaw / 2) * 2) / 2;          }                    return {            id: item.offer_id || item.link || item.url || item.offer_link || Math.random().toString(),            url: item.link || item.url || item.offer_link || '#',            image: imageUrl,            fallbackImage: fallbackImage,            title: item.name || item.title || item.model_name || item.product_name || 'Unknown Product',            brand: item.brand || '',            productName: item.model_name || item.product_name || item.name || '',            merchant: item.merchant_name || item.merchant || item.retailer || 'Retailer',            price: item.price !== undefined ? String(item.price) : '0.00',            currency: this.decodeHTML(rawCurrency),            msrp: item.was_price || item.msrp || item.original_price || null,            rawPrice: rawPrice,            rawMsrp: rawMsrp,            hasWasPrice: (item.was_price !== undefined && item.was_price !== null),            isCheckPrice: isCheckPrice,            savingLabel: savingLabel,            isPrime: isPrime,            starRating: starRating > 0 ? starRating : null,            modelId: item.model_id || '',            productKey: item.product_key || '',            merchantId: (item.merchant && typeof item.merchant === 'object') ? item.merchant.id || '' : '',            matchId: item.match_id || '',            merchantNetwork: (item.merchant && typeof item.merchant === 'object') ? item.merchant.an || '' : '',            merchantUrl: (item.merchant && typeof item.merchant === 'object') ? item.merchant.url || '' : '',            modelBrand: item.model_brand || item.brand || '',            modelParent: item.model_parent || ''          };        }        sortData() {          const sortVal = this.sortSelect ? this.sortSelect.value : 'date_desc';          if (sortVal === 'price_asc') {            this.deals.sort((a, b) => a.rawPrice - b.rawPrice);          } else if (sortVal === 'price_desc') {            this.deals.sort((a, b) => b.rawPrice - a.rawPrice);          } else if (sortVal === 'discount_desc') {            this.deals.sort((a, b) => {              const aDiscount = a.rawMsrp > a.rawPrice ? (a.rawMsrp - a.rawPrice) : 0;              const bDiscount = b.rawMsrp > b.rawPrice ? (b.rawMsrp - b.rawPrice) : 0;              return bDiscount - aDiscount;            });          } else if (sortVal === 'date_desc') {             this.deals.sort((a, b) => {                let dateA = 0;                let dateB = 0;                if (a && a.modifiedDate) {                   const valA = Array.isArray(a.modifiedDate) ? a.modifiedDate[0] : a.modifiedDate;                   dateA = new Date(valA).getTime();                   if (isNaN(dateA)) dateA = 0;                }                if (b && b.modifiedDate) {                   const valB = Array.isArray(b.modifiedDate) ? b.modifiedDate[0] : b.modifiedDate;                   dateB = new Date(valB).getTime();                   if (isNaN(dateB)) dateB = 0;                }                return dateB - dateA;             });          }        }        getFilteredDeals() {          let filteredDeals = [...this.deals];                    if (this.dealModeToggle && this.dealModeToggle.checked) {            filteredDeals = filteredDeals.filter(d => d.hasWasPrice || (d.msrp && d.rawMsrp > d.rawPrice));          }                    return filteredDeals;        }        showLoading() {          const _div = '<' + '/div>';          const skeletonCardHtml = `            \x3Cdiv class="tg-df-card">              \x3Cdiv class="tg-df-card-image-box">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-img">${_div}              ${_div}              \x3Cdiv class="tg-df-card-body">                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text title">${_div}                \x3Cdiv class="tg-df-card-footer mt-auto">                  \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text short" style="height:24px;">${_div}                ${_div}              ${_div}              \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text" style="height:44px; margin:0; border-radius:0;">${_div}            ${_div}`;          this.grid.innerHTML = Array(4).fill(skeletonCardHtml).join('');        }        showError() {          const _div = '<' + '/div>';          this.grid.innerHTML = `\x3Cdiv class="tg-df-message">            An error occurred while finding deals. Please check your connection and try again.          ${_div}`;        }        escapeHTML(str) {          if (!str) return '';          return String(str).replace(/[&<>'"]/g, tag => ({              '&': '&', '<': '<', '>': '>', "'": ''', '"': '"'          }[tag] || tag));        }                bindCouponButtons() {          const btns = this.root.querySelectorAll('.tg-df-tag-coupons');          btns.forEach(btn => {            btn.addEventListener('click', (e) => {              e.preventDefault();              e.stopPropagation();              const merchant = btn.getAttribute('data-merchant');              this.openVouchersModal(merchant);            });          });                    const closeBtn = this.root.querySelector('#tg-df-vouchers-close');          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (closeBtn) {            closeBtn.onclick = () => this.closeVouchersModal();          }          if (backdrop) {            backdrop.onclick = (e) => {              if (e.target === backdrop) this.closeVouchersModal();            };          }        }                closeVouchersModal() {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          if (backdrop) backdrop.classList.remove('active');        }                async checkMerchantsCouponsBulk(merchants) {          if (!merchants || merchants.length === 0) return {};          const controller = new AbortController();          const timeoutId = setTimeout(() => controller.abort(), 4000);          try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchants.join(','));            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '120');            url.searchParams.append('origin', 'widgets-clientside');                        let res; try { res = await fetch(url.toString(), { signal: controller.signal }); } catch (e) { return {}; }            clearTimeout(timeoutId);            if (!res.ok) return {};            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        const foundMerchants = new Set();            offers.forEach(o => {              let mName = o.merchant_name || o.merchant || o.retailer;              if (mName && typeof mName === 'object') mName = mName.name;              if (mName) foundMerchants.add(String(mName).toLowerCase());            });            const resultMap = {};            merchants.forEach(m => {              if (m) resultMap[m] = foundMerchants.has(String(m).toLowerCase());            });            return resultMap;          } catch (e) {            return {};          }        }                async openVouchersModal(merchantName) {          const backdrop = this.root.querySelector('#tg-df-vouchers-modal');          const title = this.root.querySelector('#tg-df-vouchers-title');          const content = this.root.querySelector('#tg-df-vouchers-content');                    if (!backdrop || !content) return;                    // HACK: Hide closing tags          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h4 = '<' + '/h4>';          const _svg = '<' + '/svg>';          const _circle = '<' + '/circle>';          const _polyline = '<' + '/polyline>';          const _rect = '<' + '/rect>';          const _path = '<' + '/path>';                    title.innerText = `${merchantName} Coupons & Deals`;          content.innerHTML = `\x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}                               \x3Cdiv class="tg-df-skeleton tg-df-skeleton-text">${_div}`;          backdrop.classList.add('active');                    try {            const area = this.getAreaCode();            const url = new URL('https://search-api.fie.future.net.uk/widget.php');            url.searchParams.append('model_name', 'Everything');            url.searchParams.append('language', 'en-GB');            if (area) url.searchParams.append('area', area);            url.searchParams.append('combine_product_types', '1');            url.searchParams.append('filter_merchant_name', merchantName);            url.searchParams.append('all_filters', 'false');            url.searchParams.append('exclude_unlabelled', 'false');            url.searchParams.append('include_specs', 'false');            url.searchParams.append('sort', 'voucher');            url.searchParams.append('distinct_merchants', 'natural');            url.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');            url.searchParams.append('rows', '50');            url.searchParams.append('origin', 'widgets-clientside');                        const res = await fetch(url.toString());            if (!res.ok) throw new Error('API Error');            const data = await res.json();                        let offers = [];            if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {              offers = data.widget.data.offers;            } else if (data && data.data && Array.isArray(data.data.offers)) {              offers = data.data.offers;            } else if (Array.isArray(data)) {              offers = data;            } else if (data && Array.isArray(data.offers)) {              offers = data.offers;            } else if (data && data.offers && Array.isArray(data.offers.offer)) {              offers = data.offers.offer;            } else if (data && Array.isArray(data.data)) {              offers = data.data;            }                        if (offers.length === 0) {              content.innerHTML = `\x3Cdiv class="tg-df-message">No vouchers currently available for ${this.escapeHTML(merchantName)}.${_div}`;              return;            }                        content.innerHTML = offers.map((v, idx) => {              let offerObj = v;              if (v.offers && v.offers.offer) {                offerObj = Array.isArray(v.offers.offer) ? v.offers.offer[0] : v.offers.offer;              } else if (v.offer) {                offerObj = Array.isArray(v.offer) ? v.offer[0] : v.offer;              }              let logoUrl = v.logo_url || offerObj.logo_url || '';              if (!logoUrl && v.merchant) {                if (Array.isArray(v.merchant) && v.merchant.length > 0) logoUrl = v.merchant[0].logo_url || '';                else logoUrl = v.merchant.logo_url || '';              }                            const offerName = offerObj.name || offerObj.title || v.name || v.title || 'Special Offer';              const endTime = offerObj.end_time || v.end_time || '';              const linkUrl = offerObj.link || offerObj.url || v.link || v.url || '#';                            let foundVoucherCode = '';              const findVoucherCode = (obj) => {                if (!obj || typeof obj !== 'object') return;                if (obj.type === 'voucher_code' && obj.display_value) {                  foundVoucherCode = obj.display_value;                  return;                }                if (Array.isArray(obj)) {                  for (const item of obj) {                    findVoucherCode(item);                    if (foundVoucherCode) return;                  }                } else {                  for (const k in obj) {                    if (Object.prototype.hasOwnProperty.call(obj, k)) {                      findVoucherCode(obj[k]);                      if (foundVoucherCode) return;                    }                  }                }              };              findVoucherCode(offerObj);              if (!foundVoucherCode) findVoucherCode(v);                            const voucherCode = foundVoucherCode || offerObj.voucher_code || v.voucher_code || '';              const codeHtml = voucherCode ? `\x3Cspan class="tg-df-voucher-code" data-action="copy-code" data-code="${this.escapeHTML(voucherCode)}" title="Copy to clipboard">                \x3Cspan class="tg-df-voucher-code-text">${this.escapeHTML(voucherCode)}${_span}                \x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-left:6px;flex-shrink:0;" class="tg-df-voucher-copy-icon">                  \x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2">${_rect}                  \x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1">${_path}                ${_svg}              ${_span}` : '';                            const logoHtml = logoUrl                 ? `\x3Cimg src="${this.escapeHTML(logoUrl)}" alt="${this.escapeHTML(offerName)}" class="tg-df-voucher-logo" />`                 : `\x3Cdiv class="tg-df-voucher-logo" style="background:#e2e8f0;">${_div}`;                            let expiryHtml = '';              if (endTime) {                let dStr = endTime;                if (!isNaN(dStr) && String(dStr).length === 10) dStr = Number(dStr) * 1000;                const d = new Date(dStr);                if (!isNaN(d.getTime())) {                  const options = { year: 'numeric', month: 'short', day: 'numeric' };                  expiryHtml = `                    \x3Cdiv class="tg-df-voucher-expiry">                      \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                        \x3Ccircle cx="12" cy="12" r="10">${_circle}                        \x3Cpolyline points="12 6 12 12 16 14">${_polyline}                      ${_svg}                      Expires ${d.toLocaleDateString(undefined, options)}                    ${_div}`;                }              }              const revenueIdVal = generateRevenueId(linkUrl, offerName, merchantName, null);              const rewrittenLinkUrl = rewriteAffiliateLink(linkUrl, area, revenueIdVal);              return `                \x3Ca href="${this.escapeHTML(rewrittenLinkUrl)}" target="_blank" rel="noopener nofollow" class="tg-df-voucher-item"                  data-action="voucher-click"                  data-product-name="${this.escapeHTML(offerName)}"                  data-merchant-name="${this.escapeHTML(merchantName)}"                  data-analytics-id="${this.escapeHTML(offerObj.offer_id || offerObj.id || v.id || '')}"                  data-price=""                  data-previous-price=""                  data-original-link="${this.escapeHTML(linkUrl)}"                  data-revenue-id="${revenueIdVal}"                  data-index="${idx}"                  data-total="${offers.length}"                  data-in-stock="true"                  data-currency="USD"                  data-model-id="${this.escapeHTML(offerObj.model_id || v.model_id || offerObj.id || v.id || '')}"                  data-merchant-id="${this.escapeHTML(offerObj.merchant_id || offerObj.merchant?.id || '')}"                >                  ${logoHtml}                  \x3Cdiv class="tg-df-voucher-content">                    \x3Ch4 class="tg-df-voucher-title">${this.escapeHTML(offerName)}${_h4}                    ${codeHtml}                    ${expiryHtml}                  ${_div}                ${_a}              `;            }).join('');                        // Attach copy functionality            const copyBtns = content.querySelectorAll('[data-action="copy-code"]');            copyBtns.forEach(btn => {              btn.addEventListener('click', async (e) => {                e.preventDefault();                e.stopPropagation();                                const code = btn.getAttribute('data-code');                if (!code) return;                                try {                  const copyToClipboard = async (text) => {                     if (window.navigator.clipboard && window.isSecureContext) {                        try { await window.navigator.clipboard.writeText(text); return; } catch (e) {}                     }                     const textArea = document.createElement("textarea");                     textArea.value = text;                     textArea.style.position = "fixed";                     document.body.appendChild(textArea);                     textArea.focus();                     textArea.select();                     document.execCommand('copy');                     textArea.remove();                  };                  await copyToClipboard(code);                                    // Visual feedback                  btn.classList.add('copied');                  const textSpan = btn.querySelector('.tg-df-voucher-code-text');                  const iconSvg = btn.querySelector('.tg-df-voucher-copy-icon');                                    const origText = textSpan.innerText;                  const origIcon = iconSvg.innerHTML;                                    textSpan.innerText = 'Copied!';                  iconSvg.innerHTML = `\x3Cpolyline points="20 6 9 17 4 12">${_polyline}`;                                    setTimeout(() => {                    if (btn) {                      btn.classList.remove('copied');                      if (textSpan) textSpan.innerText = origText;                      if (iconSvg) iconSvg.innerHTML = origIcon;                    }                  }, 2000);                                    trackElementInteraction({                    id: 'voucher-code-copy',                    name: 'Copy Voucher Code',                    label: `Copied ${code} for ${merchantName}`                  });                } catch (err) {                  console.warn('Failed to copy text: ', err);                }              });            });            // Attach voucher click tracking            const voucherBtns = content.querySelectorAll('[data-action="voucher-click"]');            voucherBtns.forEach(btn => {              btn.addEventListener('click', (e) => {                if (e.target.closest('[data-action="copy-code"]')) return;                                const productName = btn.getAttribute('data-product-name');                const merchantNameAttr = btn.getAttribute('data-merchant-name');                const productId = btn.getAttribute('data-analytics-id');                const price = parseFloat(btn.getAttribute('data-price')) || null;                const prevPriceStr = btn.getAttribute('data-previous-price');                const previousPrice = prevPriceStr ? parseFloat(prevPriceStr) : null;                const originalLink = btn.getAttribute('data-original-link');                const rewrittenLink = btn.getAttribute('href');                const revenueId = btn.getAttribute('data-revenue-id');                const index = parseInt(btn.getAttribute('data-index'), 10) || 0;                const inStock = btn.getAttribute('data-in-stock') === 'true';                const totalText = btn.getAttribute('data-total');                const totalDeals = parseInt(totalText, 10) || 0;                const productCategoryName = 'deals';                const trackingParams = {                  widgetId: this.widgetId,                  productCategoryName: productCategoryName,                  product: {                    modelId: btn.getAttribute('data-model-id') || null,                    matchId: btn.getAttribute('data-match-id') || null,                    brand: btn.getAttribute('data-model-brand') || null,                    parent: btn.getAttribute('data-model-parent') || null,                    name: productName,                    price: price,                    previousPrice: previousPrice,                    link: rewrittenLink,                    originalLink: originalLink,                    inStock: inStock                  },                  zeroBasedProductIndexOrNull: index,                  totalDealsOrProducts: totalDeals,                   merchant: {                    id: btn.getAttribute('data-merchant-id') || null,                    network: btn.getAttribute('data-merchant-network') || null,                    url: btn.getAttribute('data-merchant-url') || null,                    name: merchantNameAttr                  },                  revenueId: revenueId,                  widgetTypeName: this.widgetTypeName,                  isoCurrencyCode: btn.getAttribute('data-currency') || 'USD'                };                if (typeof trackDealClick === 'function') {                  trackDealClick(trackingParams);                }              });            });                                  } catch (e) {            console.warn(e);            content.innerHTML = `\x3Cdiv class="tg-df-message">Failed to load vouchers.${_div}`;          }        }        render() {          try {            if (this.getViewMode() === 'savings_squad' && this.airedaleTags.length > 0) {              if (this.categoryFilterWrapper) {                 this.categoryFilterWrapper.style.display = 'flex';              }              if (this.categoryFilter) {                 const _option = '<' + '/option>';                 let optionsHtml = `\x3Coption value="all">All Categories${_option}`;                 this.airedaleTags.forEach(tag => {                    const isSelected = this.activeDealTag === tag ? 'selected' : '';                    optionsHtml += `\x3Coption value="${this.escapeHTML(tag)}" ${isSelected}>${this.escapeHTML(tag)}${_option}`;                 });                 this.categoryFilter.innerHTML = optionsHtml;                 this.categoryFilter.value = this.activeDealTag || 'all';              }            } else {               if (this.categoryFilterWrapper) {                  this.categoryFilterWrapper.style.display = 'none';               }            }            const displayDeals = this.getFilteredDeals();          // HACK: Hide closing tags from the CMS HTML sanitizer so it doesn't strip them during in-page injection          const _div = '<' + '/div>';          const _span = '<' + '/span>';          const _a = '<' + '/a>';          const _h3 = '<' + '/h3>';          const _p = '<' + '/p>';          const _strong = '<' + '/strong>';          const _sup = '<' + '/sup>';          const _button = '<' + '/button>';          if (displayDeals.length === 0) {            if (this.currentQuery.length > 2 || (this.getViewMode() === 'savings_squad')) {              if (this.deals.length > 0) {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No deals match your selected filters.                ${_div}`;              } else if (this.getViewMode() === 'savings_squad' && this.currentQuery.length <= 2) {                 // Do not show "no exact matches" if query is empty for savings_squad                 this.grid.innerHTML = '';              } else {                 this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                  No exact matches found for "\x3Cstrong>${this.escapeHTML(this.currentQuery)}${_strong}". Try adjusting your search term.                ${_div}`;              }            } else {              this.grid.innerHTML = `\x3Cdiv class="tg-df-message">                Search product or category names to discover the best deals from across the web.              ${_div}`;            }            return;          }          let dealsHtml = displayDeals.slice(0, this.displayLimit).map((deal, index) => {            try {               const currencySym = this.escapeHTML(deal.currency);               const isoCurrencyCode = normalizeCurrency(currencySym);               const escapedPrice = this.escapeHTML(deal.price);               const escapedMsrp = this.escapeHTML(deal.msrp);               const areaCode = this.getAreaCode();                              const revenueId = generateRevenueId(deal.url, deal.title, deal.merchant, null);               const originalLink = deal.url;               const rewrittenLink = rewriteAffiliateLink(deal.url, areaCode, revenueId);                        const productCategoryName = 'deals';            const dataAttr = `              data-action="${deal.isCheckPrice ? 'view-similar-click' : 'deal-click'}"              data-analytics-id="${this.escapeHTML(deal.externalProductId || deal.id || '')}"              data-product-name="${this.escapeHTML(deal.title)}"              data-merchant-name="${this.escapeHTML(deal.merchant)}"              data-price="${deal.rawPrice || ''}"              data-previous-price="${deal.rawMsrp || ''}"              data-original-link="${this.escapeHTML(originalLink)}"              data-revenue-id="${revenueId}"              data-index="${index}"              data-total="${displayDeals.length}"              data-in-stock="${deal.inStock !== false}"              data-currency="${this.escapeHTML(isoCurrencyCode)}"              data-model-id="${this.escapeHTML(deal.modelId || '')}"              data-product-key="${this.escapeHTML(deal.productKey || '')}"              data-merchant-id="${this.escapeHTML(deal.merchantId || '')}"            `;                        let priceGroupHtml = '';            let isSavingsSquadMode = this.getViewMode() === 'savings_squad';            let ctaText = 'View Deal';            let formattedPrice = '';            let msrpHtml = '';                        if (deal.isCheckPrice) {              ctaText = 'View Deal';              if (isSavingsSquadMode) {                priceGroupHtml = ``;              } else {                priceGroupHtml = `                  \x3Cdiv class="tg-df-card-price-group">                    \x3Cspan class="tg-df-card-price" style="font-size: 15px; font-weight: 500; font-style: italic;">See price at retailer${_span}                  ${_div}                `;              }            } else {              // Format Price              formattedPrice = escapedPrice.includes(currencySym)                 ? escapedPrice                 : `${currencySym}${escapedPrice}`;                              // Format MSRP              msrpHtml = deal.msrp && deal.rawMsrp > deal.rawPrice                ? `\x3Cspan class="tg-df-card-msrp">${escapedMsrp.includes(currencySym) ? escapedMsrp : currencySym + escapedMsrp}${_span}`                : '';                              priceGroupHtml = isSavingsSquadMode ? `` : `                \x3Cdiv class="tg-df-card-price-group">                  \x3Cspan class="tg-df-card-price">${formattedPrice}${_span}                  ${msrpHtml}                ${_div}              `;            }                        const discountBadgeHtml = deal.savingLabel && !deal.isCheckPrice              ? `\x3Cspan class="tg-df-card-discount-badge">${this.escapeHTML(deal.savingLabel)}${_span}`              : '';                          // HACK for CMS            const _button = '<' + '/button>';            const _svg = '<' + '/svg>';            const _path = '<' + '/path>';            const _rect = '<' + '/rect>';            const _circle = '<' + '/circle>';            const _polyline = '<' + '/polyline>';            const _line = '<' + '/line>';                        let badgesHtml = '';            const primeBadge = deal.isPrime ? `              \x3Cspan class="tg-df-tag tg-df-tag-prime">                \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">                  \x3Cpath d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z">${_path}                ${_svg} Prime              ${_span}            ` : '';                        const couponsBadge = deal.merchant && deal.merchant.toLowerCase().includes('amazon') ? '' : `              \x3Cdiv class="tg-df-coupon-wrapper" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:inline-flex; align-items:center;">                \x3Cdiv class="tg-df-coupon-spinner">${_div}                \x3Cbutton type="button" class="tg-df-tag tg-df-tag-coupons" data-action="coupons-click" data-merchant="${this.escapeHTML(deal.merchant)}" style="display:none;">                  \x3Csvg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">                    \x3Cpath d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z">${_path}                    \x3Cline x1="7" y1="7" x2="7.01" y2="7">${_line}                  ${_svg} Coupons                ${_button}              ${_div}            `;                        // Note: We always add coupons badge if there's a chance, but to allow 3-line titles we check wrapper display state            badgesHtml = `              \x3Cdiv class="tg-df-card-badges">                ${primeBadge}                ${couponsBadge}              ${_div}            `;            const _linearGradient = '<' + '/linearGradient>';            const _polygon = '<' + '/polygon>';            const _stop = '<' + '/stop>';            const _defs = '<' + '/defs>';                        let starHtml = '';            if (deal.starRating) {              let rating = deal.starRating;                            if (rating > 0) {                const fullStars = Math.floor(rating);                const halfStar = (rating - fullStars) >= 0.5 ? 1 : 0;                const emptyStars = Math.max(0, 5 - fullStars - halfStar);                const blue = '#1f69ff'; // Tom's guide brand color from VIEW DEAL button                const gray = '#cbd5e1';                                const starSvgFull = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="${blue}" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                const gradId = 'half_grad_' + Math.floor(Math.random()*1000000);                const starSvgHalf = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" stroke="${blue}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cdefs>\x3ClinearGradient id="${gradId}" x1="0" x2="1" y1="0" y2="0">\x3Cstop offset="50%" stop-color="${blue}">${_stop}\x3Cstop offset="50%" stop-color="transparent">${_stop}${_linearGradient}${_defs}                  \x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26" fill="url(#${gradId})">${_polygon}${_svg}`;                                  const starSvgEmpty = `\x3Csvg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${gray}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">\x3Cpolygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26">${_polygon}${_svg}`;                                let stars = [];                for (let i=0; i<fullStars; i++) stars.push(starSvgFull);                if (halfStar) stars.push(starSvgHalf);                for (let i=0; i<emptyStars; i++) stars.push(starSvgEmpty);                                starHtml = `\x3Cdiv class="tg-df-card-stars" style="display:flex;align-items:center;margin-bottom:8px;font-size:13px;font-weight:600;color:var(--tg-df-text-muted);">                  \x3Cspan style="margin-right:6px;">Tom's Guide:${_span}                  \x3Cdiv style="display:flex;gap:2px;">                    ${stars.join('')}                  ${_div}                ${_div}`;              }            }            let htmlOutput = '';            if (isSavingsSquadMode) {              htmlOutput += `              \x3Cdiv class="hawk-deal-widget-container tg-df-mobile-only" data-collapsible="true">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''} style="margin-bottom: 10px;">` : ''}                \x3Cdiv class="hawk-deal-widget-wrap">                  \x3Cdiv class="hawk-deal-widget-image-container">                    \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" rel="sponsored noopener" target="_blank" class="hawk-affiliate-link-deal-widget" ${dataAttr}>                      \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="hawk-lazy-image-deal-widget" loading="lazy" width="140" height="160" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                    ${_a}                  ${_div}                  \x3Cdiv class="hawk-deal-widget-text-cta-container">                    \x3Cdiv class="hawk-deal-widget-text-body-container">                      \x3Cdiv class="hawk-deal-widget-text-body-main">                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          ${deal.isCheckPrice ? `                            \x3Cspan class="hawk-deal-widget-title-product-title">${this.escapeHTML(deal.title)}${_span}                          ` : `                            \x3Cspan class="hawk-deal-widget-title-product-title">${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_span}                          `}                        ${_a}                        ${!deal.isCheckPrice && deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan class="hawk-deal-widget-title-was-price">was ${currencySym}${escapedMsrp}${_span}                          ${_a}                        ` : ''}                        \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-container" rel="sponsored noopener" target="_blank" ${dataAttr}>                          \x3Cspan class="hawk-deal-widget-title-retailer-price">                            ${!deal.isCheckPrice ? `                              \x3Cspan class="hawk-deal-widget-title-price">now ${formattedPrice}${_span}                              \x3Cspan class="hawk-deal-widget-title-retailer"> at ${this.escapeHTML(deal.merchant)}${_span}                            ` : `                              \x3Cspan class="hawk-deal-widget-title-price">See price at ${this.escapeHTML(deal.merchant)}${_span}                            `}                          ${_span}                        ${_a}                        ${deal.description ? `\x3Cdiv class="hawk-deal-widget-text-body-description tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                          \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                          \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                            var c = this.parentNode;                            if (this.dataset.expanded === 'true') {                              var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                              if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                              pd.style.display = '-webkit-box';                              pd.style.webkitLineClamp = '3';                              this.textContent = 'READ MORE';                              this.style.position = 'absolute';                              this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                              this.style.paddingLeft = '16px';                              this.dataset.expanded = 'false';                            } else {                              var pd = this.previousElementSibling;                              pd.style.display = 'inline';                              pd.style.webkitLineClamp = 'unset';                              this.textContent = 'READ LESS';                              this.style.position = 'static';                              this.style.background = 'transparent';                              this.style.paddingLeft = '4px';                              this.dataset.expanded = 'true';                              pd.appendChild(this);                            }                          ">READ MORE${_button}                        \x3C/div>` : ''}                      ${_div}                    ${_div}                    ${deal.authorName ? `                      \x3Cdiv class="tg-df-author-line-mobile" style="padding: 0 0 12px 0; background: transparent;">                         \x3Cdiv style="display: flex; align-items: center; gap: 12px;">                            ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="40" height="40" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 40px; min-height: 40px;">` : ''}                            \x3Cdiv style="display: flex; flex-direction: column;">                               \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">\x3Cspan style="color: #FF6600;">${this.escapeHTML(deal.merchant)}${_span} deal recommended by:${_div}                               \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.3;">                                  \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                  ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                  ${deal.modifiedDate ? `\x3Cdiv style="color: var(--tg-df-text-muted); margin-top: 2px;">${getTimeAgo(deal.modifiedDate)}${_div}` : ''}                               ${_div}                            ${_div}                         ${_div}                      ${_div}                    ` : ''}                    \x3Cdiv class="hawk-deal-widget-footer">                      \x3Cdiv class="hawk-deal-widget-button-wrapper">                        \x3Cdiv class="hawk-deal-widget-preferred-partner-wrapper">                          \x3Ca data-google-interstitial="false" aria-label="View ${this.escapeHTML(deal.title)} on ${this.escapeHTML(deal.merchant)}" href="${this.escapeHTML(rewrittenLink)}" class="hawk-affiliate-link-deal-button" rel="sponsored noopener" target="_blank" ${dataAttr}>                            \x3Cspan>View Deal${_span}                          ${_a}                        ${_div}                      ${_div}                    ${_div}                  ${_div}                ${_div}              ${_div}              `;            }            htmlOutput += `              \x3Cdiv class="tg-df-card ${isSavingsSquadMode ? 'tg-df-desktop-only' : ''}">                ${this.editorMode ? `\x3Cinput type="checkbox" class="tg-df-deal-checkbox" data-id="${this.escapeHTML(deal.id)}" ${this.selectedDeals.has(deal.id) ? 'checked' : ''}>` : ''}                \x3Cdiv class="tg-df-card-image-box">                  ${discountBadgeHtml}                  \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" style="display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;">                    \x3Cimg ${deal.image ? `src="${this.escapeHTML(deal.image)}"` : ''} alt="${this.escapeHTML(deal.title)}" class="tg-df-card-image" loading="lazy" onerror="${deal.fallbackImage ? `if(!this.dataset.fb) { this.dataset.fb='1'; this.src='${this.escapeHTML(deal.fallbackImage)}'; } else { this.style.opacity='0'; }` : `this.style.opacity='0';`}">                  ${_a}                  \x3Cdiv class="tg-df-card-merchant-wrapper" style="position: absolute; bottom: 0; right: 0; background: transparent; padding: 8px 12px; z-index: 10;">                     \x3Cspan class="tg-df-card-merchant-pill" style="text-align: right; margin-bottom: 0;" title="${this.escapeHTML(deal.merchant)}">${this.escapeHTML(deal.merchant)}${_span}                  ${_div}                ${_div}                \x3Cdiv class="tg-df-card-body">                  ${starHtml}                  ${badgesHtml}                  \x3Ch3 class="tg-df-card-title tg-df-custom-savings-squad-title" title="${this.escapeHTML(deal.title)}">                    \x3Ca href="${this.escapeHTML(rewrittenLink)}" disable-tracking="true" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit;">                      ${isSavingsSquadMode                         ? (deal.isCheckPrice                             ? (deal.title && deal.title.includes(':')                                 ? `\x3Cstrong>${this.escapeHTML(deal.title.substring(0, deal.title.indexOf(':') + 1))}${_strong}\x3Cspan style="color: #1f69ff; font-weight: normal;">${this.escapeHTML(deal.title.substring(deal.title.indexOf(':') + 1))}${_span}`                                : this.escapeHTML(deal.title)                              )                             : `\x3Cstrong>${deal.brand ? this.escapeHTML(deal.brand) + ' ' : ''}${this.escapeHTML(deal.productName || deal.title || '')}:${_strong} ${deal.rawMsrp && deal.rawMsrp > deal.rawPrice ? `\x3Cspan style="color: #d0021b; text-decoration: line-through; font-weight: normal; margin-right: 4px;">was ${currencySym}${escapedMsrp}${_span} ` : ''}\x3Cspan style="color: #1f69ff; font-weight: normal;">now ${formattedPrice} at ${this.escapeHTML(deal.merchant)}${_span}`                          )                        : this.escapeHTML(deal.title)                      }                    ${_a}                  ${_h3}                  ${deal.description ? `\x3Cdiv class="tg-df-card-desc-container" style="margin-bottom: 12px; position: relative;">                    \x3Cp class="tg-df-card-desc-content" style="font-size: 13px; color: var(--tg-df-text-muted); margin-bottom: 0; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;">${this.escapeHTML(deal.description)}${_p}                    \x3Cbutton type="button" class="tg-df-card-desc-btn" style="display: none; appearance: none; border: none; color: #000000; font-size: 11px; font-weight: 700; text-transform: uppercase; cursor: pointer; font-family: inherit; position: absolute; bottom: 2px; right: 0; background: linear-gradient(to right, transparent, #fff 20%, #fff); padding: 0 0 0 16px;" onclick="                      var c = this.parentNode;                      if (this.dataset.expanded === 'true') {                        var pd = (c.tagName === 'P') ? c : this.previousElementSibling;                        if (c.tagName === 'P') { c.parentNode.appendChild(this); pd = c; }                        pd.style.display = '-webkit-box';                        pd.style.webkitLineClamp = '3';                        this.textContent = 'READ MORE';                        this.style.position = 'absolute';                        this.style.background = 'linear-gradient(to right, transparent, #fff 20%, #fff)';                        this.style.paddingLeft = '16px';                        this.dataset.expanded = 'false';                      } else {                        var pd = this.previousElementSibling;                        pd.style.display = 'inline';                        pd.style.webkitLineClamp = 'unset';                        this.textContent = 'READ LESS';                        this.style.position = 'static';                        this.style.background = 'transparent';                        this.style.paddingLeft = '4px';                        this.dataset.expanded = 'true';                        pd.appendChild(this);                      }                    ">READ MORE${_button}                  \x3C/div>` : ''}                  \x3Cdiv class="tg-df-card-footer">                    ${deal.authorName ? `                    \x3Cdiv class="tg-df-author-line-desktop" style="padding: 0 0 ${isSavingsSquadMode ? 0 : 12}px 0;">                       \x3Cdiv style="display: flex; align-items: center; gap: 10px;">                          ${deal.authorImage ? `\x3Cimg src="${this.escapeHTML(deal.authorImage)}" alt="${this.escapeHTML(deal.authorName)}" class="tg-df-author-img" width="36" height="36" style="border-radius: 50%; object-fit: cover; flex-shrink: 0; aspect-ratio: 1 / 1; min-width: 36px; min-height: 36px;">` : ''}                          \x3Cdiv style="display: flex; flex-direction: column;">                             \x3Cdiv style="font-size: 10px; color: var(--tg-df-text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px; font-weight: 600;">Recommended by:${_div}                             \x3Cdiv style="font-size: 11px; color: var(--tg-df-text); line-height: 1.2;">                                \x3Cstrong>\x3Ca href="https://www.tomsguide.com/${this.escapeHTML(deal.documentUrl || '').replace(/^\/+/, '')}" target="_blank" rel="noopener nofollow" style="text-decoration: none; color: inherit; border-bottom: 1px dotted var(--tg-df-text-muted);">${this.escapeHTML(deal.authorName)}${_a}${_strong}                                ${deal.authorRole && !['null', 'nul', 'undefined'].includes(String(deal.authorRole).toLowerCase()) ? ` • ${this.escapeHTML(deal.authorRole)}` : ''}                                ${deal.modifiedDate ? `\x3Cspan style="color: var(--tg-df-text-muted);"> • ${getTimeAgo(deal.modifiedDate)}${_span}` : ''}                             ${_div}                          ${_div}                       ${_div}                    ${_div}                    ` : ''}                    ${priceGroupHtml}                  ${_div}                ${_div}                \x3Ca href="${this.escapeHTML(rewrittenLink)}" ${dataAttr} target="_blank" rel="noopener nofollow" class="tg-df-card-cta" style="text-decoration: none; border-radius: 0;">${ctaText}${_a}              ${_div}            `;                        return htmlOutput;            } catch (e) {               console.log("Error rendering deal in map for index", index, typeof deal === 'object' ? JSON.stringify(deal) : deal, "MSG:", e.message);               return '';            }          }).join('');                    if (displayDeals.length > this.displayLimit) {            dealsHtml += `              \x3Cdiv style="width: 100%; display: flex; justify-content: center; margin-top: 16px; grid-column: 1 / -1;">                \x3Cbutton type="button" class="tg-df-tag-outline tg-df-load-more" style="padding: 8px 24px; border-radius: 100px; font-weight: 600; font-size: 14px; cursor: pointer;">Load More${_button}              ${_div}            `;          }                    this.grid.innerHTML = dealsHtml;          // Inject JSON-LD          try {            let targetNode = this.hostContainer || document.head;            let jsonLdScript = targetNode.querySelector('#tg-df-json-ld-' + this.widgetId);            if (!jsonLdScript) {                jsonLdScript = document.createElement('script');                jsonLdScript.type = 'application/ld+json';                jsonLdScript.id = 'tg-df-json-ld-' + this.widgetId;                targetNode.appendChild(jsonLdScript);            }            const jsonLdData = {              "@context": "https://schema.org",              "@type": "ItemList",              "itemListElement": displayDeals.slice(0, this.displayLimit).map((deal, index) => {                 let isoCurrency = "USD";                 if (deal.currency === '£') isoCurrency = "GBP";                 else if (deal.currency === '€') isoCurrency = "EUR";                 else if (deal.currency === 'A$') isoCurrency = "AUD";                 else if (deal.currency === 'CA$') isoCurrency = "CAD";                 const areaCode = typeof this.getAreaCode === 'function' ? this.getAreaCode() : 'US';                 const revenueId = typeof generateRevenueId === 'function' ? generateRevenueId(deal.url, deal.title, deal.merchant, null) : '';                 const rewrittenLink = typeof rewriteAffiliateLink === 'function' ? rewriteAffiliateLink(deal.url, areaCode, revenueId) : deal.url;                 return {                   "@type": "ListItem",                   "position": index + 1,                   "item": {                     "@type": "Product",                     "name": deal.title,                     "image": deal.image || "",                     "description": deal.description || "",                     "brand": {                       "@type": "Brand",                       "name": deal.brand || ""                     },                     "offers": {                       "@type": "Offer",                       "priceCurrency": isoCurrency,                       "price": deal.rawPrice || 0,                       "url": rewrittenLink,                       "seller": {                         "@type": "Organization",                         "name": deal.merchant || ""                       }                     }                   }                 };              }).filter(item => item.item.name)            };            jsonLdScript.textContent = JSON.stringify(jsonLdData);          } catch(e) { console.warn("JSON-LD generation failed", e); }          setTimeout(() => {            const contents = this.root.querySelectorAll('.tg-df-card-desc-content');            contents.forEach(p => {              if (p.scrollHeight > p.clientHeight || p.scrollHeight > 60) {                if (p.nextElementSibling) {                  p.nextElementSibling.style.display = 'block';                }              }            });                        // Allow hawklinks.js to discover and rewrite our widget links             // by appending the .article-body class and manually triggering processArticle.            let container = this.root.classList.contains('tg-df-container') ? this.root : this.root.querySelector('.tg-df-container');            if (container && !container.classList.contains('article-body')) {               container.classList.add('article-body');            }            if (this.grid && !this.grid.classList.contains('article-body')) this.grid.classList.add('article-body');            document.dispatchEvent(new CustomEvent('processArticle', { detail: { element: this.root } }));          }, 50);          const loadMoreBtn = this.grid.querySelector('.tg-df-load-more');          if (loadMoreBtn) {            loadMoreBtn.addEventListener('click', () => {              if (typeof trackElementInteraction === 'function') {                trackElementInteraction({ id: 'load-more', name: 'Load more', label: 'Load More Results' });              }              this.displayLimit += this.getRowsLimit();              this.render();            });          }                      this.bindCouponButtons();            this.checkAndUpdateCoupons();          } catch(e) {            console.warn("Widget render error", e);          }        }                async checkAndUpdateCoupons() {          const wrappers = Array.from(this.root.querySelectorAll('.tg-df-coupon-wrapper'));          if (wrappers.length === 0) return;                    const merchants = [...new Set(wrappers.map(w => w.getAttribute('data-merchant')).filter(Boolean))];          if (merchants.length === 0) return;          const couponResultsMap = await this.checkMerchantsCouponsBulk(merchants);                    for (const merchant of merchants) {            const hasCoupons = !!couponResultsMap[merchant];            const merchantWrappers = wrappers.filter(w => w.getAttribute('data-merchant') === merchant);            merchantWrappers.forEach(wrapper => {              const spinner = wrapper.querySelector('.tg-df-coupon-spinner');              const btn = wrapper.querySelector('.tg-df-tag-coupons');                            if (spinner) spinner.style.display = 'none';                            if (hasCoupons && btn) {                btn.style.display = 'inline-flex';              } else if (!hasCoupons) {                wrapper.style.display = 'none';              }            });          }        }        updateFloatingCopyBar() {          if (!this.editorBar || !this.editorSelectedCount) return;          if (this.editorMode && this.selectedDeals.size > 0) {            this.editorBar.style.display = 'flex';            this.editorSelectedCount.innerText = this.selectedDeals.size;          } else {            this.editorBar.style.display = 'none';          }        }        async copySelectedDealsToCMS() {           function htmlToSlate(htmlString) {              if (!htmlString) return [{ type: 'paragraph', children: [{ text: '' }] }];              let doc;              if (typeof window !== 'undefined' && window.DOMParser) {                 doc = new DOMParser().parseFromString(htmlString, 'text/html');              } else {                 doc = document.implementation.createHTMLDocument('');                 doc.body.innerHTML = htmlString;              }                            function parseNode(node, marks = {}) {                  if (node.nodeType === 3) {                      const text = node.textContent;                      if (!text) return null;                      return { text: text, ...marks };                  }                  if (node.nodeType === 1) {                      const tagName = node.tagName.toLowerCase();                      if (tagName === 'br') {                          return { type: 'line-break', children: [{ text: '' }] };                      }                      if (tagName === 'p') {                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return { type: 'paragraph', children };                      }                      if (tagName === 'strong' || tagName === 'b') {                          const newMarks = { ...marks, bold: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'em' || tagName === 'i') {                          const newMarks = { ...marks, italic: true };                          return Array.from(node.childNodes).map(child => parseNode(child, newMarks)).flat().filter(Boolean);                      }                      if (tagName === 'a') {                          const href = node.getAttribute('href') || '';                          let children = Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                          if (children.length === 0) children.push({ text: "" });                          return {                              type: 'link',                              url: href,                              isNoFollow: (node.getAttribute('rel') || '').includes('nofollow'),                              isSponsored: (node.getAttribute('rel') || '').includes('sponsored'),                              isOpenNewTab: node.getAttribute('target') === '_blank',                              isPreventDataRewrite: false,                              children: children                          };                      }                      return Array.from(node.childNodes).map(child => parseNode(child, marks)).flat().filter(Boolean);                  }                  return null;              }                            let blocksArray = [];              let currentParagraphChildren = [];              function flushParagraph() {                  if (currentParagraphChildren.length > 0) {                      blocksArray.push({ type: 'paragraph', children: currentParagraphChildren });                      currentParagraphChildren = [];                  }              }              Array.from(doc.body.childNodes).forEach(node => {                  const parsed = parseNode(node, {});                  const parsedItems = Array.isArray(parsed) ? parsed : (parsed ? [parsed] : []);                  parsedItems.forEach(item => {                      if (item.type === 'paragraph') {                          flushParagraph();                          blocksArray.push(item);                      } else {                          currentParagraphChildren.push(item);                      }                  });              });              flushParagraph();              if (blocksArray.length === 0) {                  blocksArray = [{ type: 'paragraph', children: [{ text: '' }] }];              }              return blocksArray;           }           const blocks = [];                      this.editorCopyBtn.innerHTML = '\x3Cspan class="tg-df-coupon-spinner" style="display:inline-block; margin-right:8px; border-top-color:#fff;">' + '<' + '/span> Copying...';           for (const deal of Array.from(this.selectedDeals.values())) {              const url = deal.url;              const merchant = deal.merchant;              const title = deal.title;              const image = deal.image;              const currentPrice = deal.currency + deal.rawPrice;              const wasPrice = deal.hasWasPrice && deal.rawMsrp > deal.rawPrice ? deal.currency + deal.rawMsrp : '';                            let couponsChildren = [];              try {                  const area = this.getAreaCode();                  const apiUrl = new URL('https://search-api.fie.future.net.uk/widget.php');                  apiUrl.searchParams.append('model_name', 'Everything');                  apiUrl.searchParams.append('language', 'en-GB');                  apiUrl.searchParams.append('area', area);                  apiUrl.searchParams.append('combine_product_types', '1');                  apiUrl.searchParams.append('filter_merchant_name', merchant);                  apiUrl.searchParams.append('all_filters', 'false');                  apiUrl.searchParams.append('exclude_unlabelled', 'false');                  apiUrl.searchParams.append('include_specs', 'false');                  apiUrl.searchParams.append('sort', 'voucher');                  apiUrl.searchParams.append('distinct_merchants', 'natural');                  apiUrl.searchParams.append('filter_product_types', 'vouchers,offer_deals,newsletter');                  apiUrl.searchParams.append('rows', '3');                  apiUrl.searchParams.append('origin', 'widgets-clientside');                                    let res; try { res = await fetch(apiUrl.toString()); } catch (e) { return; }                  if (res.ok) {                      const data = await res.json();                      let offers = [];                      if (data && data.widget && data.widget.data && Array.isArray(data.widget.data.offers)) {                        offers = data.widget.data.offers;                      } else if (data && data.data && Array.isArray(data.data.offers)) {                        offers = data.data.offers;                      }                                            if (offers.length > 0) {                          couponsChildren.push({ text: "Also check out these coupons: ", bold: true });                          offers.slice(0, 3).forEach((offer, idx) => {                              const actualOffer = offer.offer || offer;                              const offerName = actualOffer.name || actualOffer.title || offer.model_name || offer.title || offer.name || 'Coupon';                              const linkUrl = actualOffer.link || actualOffer.url || actualOffer.offer_link || '#';                              couponsChildren.push({ type: "line-break", children: [{ text: "" }] });                              couponsChildren.push({ text: "🎟️ " });                              couponsChildren.push({                                  type: "link",                                  url: linkUrl,                                  isNoFollow: true,                                  isSponsored: false,                                  isOpenNewTab: true,                                  isPreventDataRewrite: false,                                  children: [{ text: offerName, bold: true }]                              });                          });                      }                  }              } catch (err) {                  console.warn('Failed to fetch coupons for', merchant, err);              }              let descriptionValue = [];              if (deal.text) {                 descriptionValue = htmlToSlate(deal.text);              } else {                 const dealDescriptions = [                   `Don't miss out on this fantastic deal for the ${title}. It is currently available at ${merchant} for a highly competitive price.`,                   `We've spotted an excellent price drop on the ${title}. Grab it now at ${merchant} before it's gone.`,                   `The ${title} is currently seeing a generous discount over at ${merchant}. This is a perfect time to buy if you've been holding out.`,                   `If you're in the market for the ${title}, ${merchant} has just the deal for you.`,                   `Score the ${title} for less at ${merchant} right now. This is a rare chance to save big.`,                   `Upgrade your setup with the ${title}, now available at a stellar price via ${merchant}.`                 ];                 const randomDescription = dealDescriptions[Math.floor(Math.random() * dealDescriptions.length)];                 descriptionValue = [                    { type: "paragraph", children: [{ text: randomDescription }] }                 ];              }                            if (couponsChildren.length > 0) {                 let lastBlock = descriptionValue[descriptionValue.length - 1];                 if (lastBlock && lastBlock.type === 'paragraph') {                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children.push({ text: "Also check out these coupons: ", bold: true });                     lastBlock.children.push({ type: "line-break", children: [{ text: "" }] });                     lastBlock.children = lastBlock.children.concat(couponsChildren);                 } else {                     descriptionValue.push({                         type: "paragraph",                         children: [                             { type: "line-break", children: [{ text: "" }] },                             { type: "line-break", children: [{ text: "" }] },                             { text: "Also check out these coupons: ", bold: true },                             { type: "line-break", children: [{ text: "" }] },                             ...couponsChildren                         ]                     });                 }              }              function normalizeCurrencyToISO(symbol) {                const map = { '£': 'GBP', '$': 'USD', 'A$': 'AUD', 'CA$': 'CAD', '€': 'EUR' };                return map[symbol] || symbol;              }              const isoCurrency = normalizeCurrencyToISO(deal.currency);              blocks.push({                 id: (window.crypto && window.crypto.randomUUID) ? window.crypto.randomUUID() : 'cms-' + Date.now() + Math.random(),                 blockTypeName: "deal",                 excludeFrom: [],                 collapsible: false,                 props: {                    description: {                       value: descriptionValue,                       touched: false,                       validationMessage: ""                    },                    image: {                       value: {                          credit: [{ type: "paragraph", children: [{ text: merchant }] }],                          dateCreated: Date.now(),                          dateModified: Date.now(),                          distribution: [],                          fileSize: 0,                          height: 1000,                          id: deal.id,                          imageRights: "",                          src: image,                          name: title + ".jpg",                          tags: [],                          width: 1000                       },                       touched: false,                       validationMessage: ""                    },                    showDealButton: { value: true, touched: false, validationMessage: "" },                    isPreferredPartner: { value: false, touched: false, validationMessage: "" },                    linkHref: { value: url, touched: false, validationMessage: "" },                    linkLabel: { value: "", touched: false, validationMessage: "" },                    linkIsNoFollow: { value: true, touched: false, validationMessage: "" },                    linkIsSponsored: { value: false, touched: false, validationMessage: "" },                    linkIsOpenNewWindow: { value: true, touched: false, validationMessage: "" },                    customPromoFlags: { value: [], touched: false, validationMessage: "" },                    showStarDeal: { value: false, touched: false, validationMessage: "" },                    savingType: { value: "none", touched: false, validationMessage: "" },                    starDealPromoFlag: { value: "", touched: false, validationMessage: "" },                    showEditorsChoice: { value: false, touched: false, validationMessage: "" },                    editorsChoiceTitle: { value: "", touched: false, validationMessage: "" },                    hawkPriceCurrency: { value: { value: isoCurrency, label: isoCurrency }, touched: false, validationMessage: "" },                    hawkPrice: { value: deal.hasWasPrice ? String(deal.rawMsrp) : String(deal.rawPrice), touched: false, validationMessage: "" },                    hawkSalePrice: { value: String(deal.rawPrice), touched: false, validationMessage: "" },                    lastCheckedPriceDate: { value: "", touched: false, validationMessage: "" },                    hawkModel: { touched: false, validationMessage: "" },                    productId: { value: "", touched: false, validationMessage: "" },                    voucherId: { value: "", touched: false, validationMessage: "" },                    brand: { value: deal.brand || merchant, touched: false, validationMessage: "" },                    productName: { value: title, touched: false, validationMessage: "" },                    label: { value: "", touched: false, validationMessage: "" },                    retailer: { value: merchant, touched: false, validationMessage: "" },                    priceCheckError: false                 },                 failedFetchError: ""              });           }           const payload = {              type: "articleBuilderPages",              data: blocks           };           const jsonStr = JSON.stringify(payload);                      if (navigator.clipboard && navigator.clipboard.writeText) {              navigator.clipboard.writeText(jsonStr).then(() => {                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              }).catch(err => {                 console.warn('Failed to copy text: ', err);                 alert('Failed to copy deals to clipboard. See console.');              });           } else {              // Fallback              const textArea = document.createElement("textarea");              textArea.value = jsonStr;              document.body.appendChild(textArea);              textArea.focus();              textArea.select();              try {                 document.execCommand('copy');                 this.editorCopyBtn.innerHTML = 'Copied!';                 setTimeout(() => {                    this.editorCopyBtn.innerHTML = '\x3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 6px;">\x3Crect x="9" y="9" width="13" height="13" rx="2" ry="2"><' + '/rect>\x3Cpath d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"><' + '/path><' + '/svg> Copy to CMS';                 }, 2000);              } catch (err) {                 console.warn('Fallback: Oops, unable to copy', err);                 alert('Fallback: Failed to copy deals to clipboard.');              }              document.body.removeChild(textArea);           }        }      }      // Initialize the Widget      if (document.readyState === 'loading') {        document.addEventListener('DOMContentLoaded', () => new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer }));      } else {        new DealsFinderWidget({ rootId: 'signal-deals-finder-root', rootNode: shadowRoot, hostContainer: hostContainer });      }    })();  </script></div>
                                                            </article>
                            ]]>
                        </content:encoded>
                                                </item>
            </channel>
</rss>